【栈的定义】

栈(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_栈_顺序存储结构(数组形式)相关推荐

  1. 栈的顺序存储结构框架搭建

    栈的顺序存储结构 数组模拟 #define MAX_SIZE 1024 #define SEQSTACK_TRUE 1 #define SEQSTACK_FALSE 0 结构体 typedef str ...

  2. 栈的顺序存储结构(顺序栈)

    栈的顺序存储结构 1.顺序栈的存储结构 #define MAXSIZE 100 //顺序栈存储空间的初始分配 typedef struct{SElemType *base; //栈底指针SElemTy ...

  3. 栈的顺序存储结构、链式存储架构及其实现

    顺序栈和链式栈的时间复杂度均为O(1), 因此唯一可以比较的是空间性能.初始时顺序栈必须开辟一个固定的长度内存,所以存在可存储元素个数限制和浪费空间的问题.链式栈没有栈满的问题,只有当内存空间用完才会 ...

  4. 数据结构——栈的顺序存储结构

    一.栈的概念 栈是一种操作受限的,只允许一端进行插入和删除的线性表,允许进行操作的一端叫做栈顶(top),另一端为栈底(bottom),插入操作为入栈或进栈,删除操作称为出栈或退栈. 二.栈的顺序存储 ...

  5. D-OJ刷题日记:栈的顺序存储结构与操作 题目编号:457

    请你定义一个顺序栈,可以对顺序栈进行"将某个元素入栈"."弹出栈顶元素"."取栈顶元素(不删除)"."判断栈是否为空". ...

  6. python 结构体数组_将结构数组从Python传递给C

    [更新:问题已解决!参见文章底部] 我需要允许Python开发人员将一组打包数据(在这种情况下)通过API插入到API中,这是通过Python C API手动暴露的一系列C++接口.我的初步印象是使用 ...

  7. 栈的顺序存储及实现(二)

    栈的介绍 栈(stack)是限定仅在表尾进行插入和删除操作的线性表. 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈.栈又被称为后进先出(L ...

  8. 循环队列 - 顺序存储结构

    队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.是一种先进先出的线性表(FIFO).允许插入的一端称为队尾,允许删除的一端称为队头.我们在<栈的顺序存储结构> ...

  9. c语言实现顺序存储程序,线性表的顺序存储结构动态态分配C语言实现

    线性表的顺序存储结构动态态分配C语言实现 线性表的顺序存储结构动态态分配C语言实现 初始化执行期间通过malloc函数为数组申请空间,程序运行期间若空间不够可通过realloc函数在保留原存储值的前提 ...

最新文章

  1. Android系统广播大全
  2. 20行代码实现电影评论情感分析
  3. 访问云服务器储存的mp4_服务器如何存储视频文件格式
  4. [学习笔记]面向对象VS面向过程
  5. array专题2---理解暴力枚举与动态规划
  6. Dojo实现Tabs页报错(二)
  7. Flask学习笔记02:实现用户登录功能
  8. 产品开发的组织架构和开发管理
  9. 电子围栏判断_脉冲电子围栏和张力围栏之间的区别
  10. 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)...
  11. 403 for URL: http://www.terracotta.org/kit/reflector
  12. iOS实例、类、元类
  13. npm 安装axios报错
  14. centos ntp日志_centos NTP服务器配置总结
  15. 读懂React原理之调和与Fiber
  16. VirtualDub
  17. Elastic认证考试过程(2022.11.13 06:15)
  18. Web前端页面访问权限控制总结
  19. flume backoff 退避算法
  20. c++ 输入数字 输出汉语读法(拼音)代码

热门文章

  1. SharePoint 2010 change home page或者default page
  2. CSM+3PAR帮助XXX教育技术中心
  3. 2003年我程序员职业的第一桶金7万元的【教育集团招生收费系统】项目经验、项目来龙去脉分享...
  4. Ubuntu下安装Python开发的Facebook Faiss相似性搜索工具
  5. tensorboard scalar图下载失败不完整解决
  6. discuz!x2.5登录管理面板
  7. 百度爬虫爬到虚拟链接 网站被黑_网站地图sitemap对SEO优化有什么作用?
  8. 151. 翻转字符串里的单词
  9. 索引语法——创建索引 || 查看索引 || 删除索引 || ALTER命令 索引设计原则
  10. 案例开发分析 || ​​​​​​​Scheduler组件