3.1_栈_顺序存储结构(数组形式)
【栈的定义】
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
栈又称为后进先出(Last In First Out)线性表,简称LIFO结构。
(PS:定义中的表尾是指 栈顶!)
【几个关键词 】
[ 栈顶(top) ]
允许插入和删除的一端称为 栈顶。
[ 栈底(bottom) ]
栈顶的另一端称为 栈底。
[ 空栈 ]
不含任何数据元素的栈。
【栈的插入操作——进栈(push)】
栈的插入操作,叫做进栈,也称为压栈、入栈。
【栈的删除操作——出栈(pop)】
栈的删除操作,叫做出栈,也称为弹栈。
【进栈出栈的变化形式】
如果3个整数1,2,3依次入栈,会有哪些出栈次序?
第一种:1-2-3进栈,即3-2-1出栈。
第二种:1进,1出,2斤,2出,3进,3出,进一个出一个,即1-2-3出栈。
第三种:1进,2进,2出,1出,3进,3出,即2-1-3出栈。
第四种:1进,1出,2进,3进,3出,2出,即1-3-2出栈。
第四种:1进,2进,2出,3进,3出,2出,即2-3-1出栈
【栈的抽象数据类型】
ADT 栈(stack) Data同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。 OperationInitStack(*S) 初始化操作,建立一个空栈SDestoryStack(*S) 若栈存在,则销毁它ClearStack(*S) 将栈清空StackEmpty(S) 若栈为空,返回true,否则返回false。GetTop(S,*e) 若栈S存在且非空,用e返回S的栈顶元素。Push(*S,e) 若栈S存在,插入新元素e到栈S中并成为栈顶元素。 Pop(*S,*e) 删除栈S中栈顶元素,并用e返回其值。 StackLength(S) 返回栈S的元素个数。 endADT
【自定义的栈MyStack.java】
package com.Higgin.Stack;import java.util.ArrayList; import java.util.Arrays; import java.util.EmptyStackException;public class MyStack {protected Object[] elementData; //栈中具体的对象数组protected int elementCount; //栈顶指针protected int capacityIncrement;//当栈满了,每次增长栈的容量 public MyStack(int initialCapacity,int capacityIncrement){if(initialCapacity<0){ //如果初始化栈的容量小于0,抛出异常throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}this.elementData=new Object[initialCapacity];this.capacityIncrement=capacityIncrement;}public MyStack(int initialCapacity){this(initialCapacity,0); //默认增长的容量为0 }public MyStack(){this(10); //默认初始栈的容量为10 }/*** 返回栈中的已存的元素个数*/public int size(){return elementCount;}/*** 判断是否为空栈*/public boolean empty(){return size()==0;}/*** 进栈*/public Object push(Object obj){if((elementCount+1)>elementData.length){ //如果再添加一个对象,导致溢出,则扩容(若不想扩容直接抛出异常即可)grow(elementCount+1); //扩容 }elementData[elementCount++]=obj;return obj;}/*** 查看栈顶部的元素,但不从栈中移除它*/public Object peek(){int len=size();if(len==0){throw new EmptyStackException();}return elementData[len-1];}/*** 出栈*/public Object pop(){Object obj=peek(); //获取栈顶的对象,里面包含了判断栈是否为空的判断elementCount--;elementData[elementCount]=null;return obj;}/*** 查找对象的位置*/public int search(Object obj){if(size()==0){ //如果是空栈,直接不找throw new EmptyStackException();}int i=lastIndexOf(obj);if(i>=0){return size()-i;}return -1;}/*** 扩容* (如果再存入数据时,容量不够,就进行扩容)*/public void grow(int minCapacity){ //扩容方法int oldCapacity=elementData.length; //原来的容量int newCapacity=oldCapacity+((capacityIncrement>0)?capacityIncrement:oldCapacity); //增长后的新容量:设置过就为 老容量+设置值 ,否则就直接翻倍 if(newCapacity<minCapacity){ //如果新增后的容量依然过小,直接把当前值指针的值传过来(这个应该是容量过大的时候)newCapacity=minCapacity;}if(newCapacity-Integer.MAX_VALUE>8){ if(minCapacity<0){ //说明都溢出了throw new OutOfMemoryError(); //直接抛出错误 }newCapacity=(minCapacity>(Integer.MAX_VALUE-8)?Integer.MAX_VALUE:(Integer.MAX_VALUE-8));}elementData=Arrays.copyOf(elementData, newCapacity); //扩容后的elementData }/*** 找出obj对象在 elementData[i]中最后的位置,对于栈而言,其实是离栈顶最近的位置*/public int lastIndexOf(Object obj){if(obj==null){for(int i=elementCount-1;i>=0;i--){if(elementData[i]==null){return i;}}}else{for(int i=elementCount-1;i>=0;i--){if(obj.equals(elementData[i])){return i;}}}return -1;} }
【测试】
package com.Higgin.Stack;import org.junit.Test;public class TestMyStack {@Testpublic void test1(){MyStack ms=new MyStack();System.out.println("是否为空==="+ms.empty()); //truems.push(11);ms.push(22);ms.push(33);System.out.println("最近一次添加的是33==="+ms.peek()); //33ms.push(44); ms.push(55);System.out.println("最近一次添加的是55==="+ms.peek()); //55System.out.println("寻找22的位置==="+ms.search(22)); //4System.out.println("寻找55的位置==="+ms.search(55)); //1System.out.println("寻找99的位置(不存在)==="+ms.search(99)); //-1 ms.pop(); System.out.println("执行了一次pop,栈顶的元素==="+ms.peek()); //44System.out.println("栈移除了之后的长度为===="+ms.size()); //4 } }
【运行结果】
转载于:https://www.cnblogs.com/HigginCui/p/6095247.html
3.1_栈_顺序存储结构(数组形式)相关推荐
- 栈的顺序存储结构框架搭建
栈的顺序存储结构 数组模拟 #define MAX_SIZE 1024 #define SEQSTACK_TRUE 1 #define SEQSTACK_FALSE 0 结构体 typedef str ...
- 栈的顺序存储结构(顺序栈)
栈的顺序存储结构 1.顺序栈的存储结构 #define MAXSIZE 100 //顺序栈存储空间的初始分配 typedef struct{SElemType *base; //栈底指针SElemTy ...
- 栈的顺序存储结构、链式存储架构及其实现
顺序栈和链式栈的时间复杂度均为O(1), 因此唯一可以比较的是空间性能.初始时顺序栈必须开辟一个固定的长度内存,所以存在可存储元素个数限制和浪费空间的问题.链式栈没有栈满的问题,只有当内存空间用完才会 ...
- 数据结构——栈的顺序存储结构
一.栈的概念 栈是一种操作受限的,只允许一端进行插入和删除的线性表,允许进行操作的一端叫做栈顶(top),另一端为栈底(bottom),插入操作为入栈或进栈,删除操作称为出栈或退栈. 二.栈的顺序存储 ...
- D-OJ刷题日记:栈的顺序存储结构与操作 题目编号:457
请你定义一个顺序栈,可以对顺序栈进行"将某个元素入栈"."弹出栈顶元素"."取栈顶元素(不删除)"."判断栈是否为空". ...
- python 结构体数组_将结构数组从Python传递给C
[更新:问题已解决!参见文章底部] 我需要允许Python开发人员将一组打包数据(在这种情况下)通过API插入到API中,这是通过Python C API手动暴露的一系列C++接口.我的初步印象是使用 ...
- 栈的顺序存储及实现(二)
栈的介绍 栈(stack)是限定仅在表尾进行插入和删除操作的线性表. 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈.栈又被称为后进先出(L ...
- 循环队列 - 顺序存储结构
队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.是一种先进先出的线性表(FIFO).允许插入的一端称为队尾,允许删除的一端称为队头.我们在<栈的顺序存储结构> ...
- c语言实现顺序存储程序,线性表的顺序存储结构动态态分配C语言实现
线性表的顺序存储结构动态态分配C语言实现 线性表的顺序存储结构动态态分配C语言实现 初始化执行期间通过malloc函数为数组申请空间,程序运行期间若空间不够可通过realloc函数在保留原存储值的前提 ...
最新文章
- Android系统广播大全
- 20行代码实现电影评论情感分析
- 访问云服务器储存的mp4_服务器如何存储视频文件格式
- [学习笔记]面向对象VS面向过程
- array专题2---理解暴力枚举与动态规划
- Dojo实现Tabs页报错(二)
- Flask学习笔记02:实现用户登录功能
- 产品开发的组织架构和开发管理
- 电子围栏判断_脉冲电子围栏和张力围栏之间的区别
- 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)...
- 403 for URL: http://www.terracotta.org/kit/reflector
- iOS实例、类、元类
- npm 安装axios报错
- centos ntp日志_centos NTP服务器配置总结
- 读懂React原理之调和与Fiber
- VirtualDub
- Elastic认证考试过程(2022.11.13 06:15)
- Web前端页面访问权限控制总结
- flume backoff 退避算法
- c++ 输入数字 输出汉语读法(拼音)代码
热门文章
- SharePoint 2010 change home page或者default page
- CSM+3PAR帮助XXX教育技术中心
- 2003年我程序员职业的第一桶金7万元的【教育集团招生收费系统】项目经验、项目来龙去脉分享...
- Ubuntu下安装Python开发的Facebook Faiss相似性搜索工具
- tensorboard scalar图下载失败不完整解决
- discuz!x2.5登录管理面板
- 百度爬虫爬到虚拟链接 网站被黑_网站地图sitemap对SEO优化有什么作用?
- 151. 翻转字符串里的单词
- 索引语法——创建索引 || 查看索引 || 删除索引 || ALTER命令 索引设计原则
- 案例开发分析 || ​​​​​​​Scheduler组件