一、堆栈的基本概念
堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作。
堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈
从输入和输出数据元素的位置关系看,堆栈的功能和一种火车调度装置的功能类同。
二、堆栈抽象数据类型
数据集合
堆栈的数据集合可以表示为a0,a1,…,an-1,每个数据元素的数据类型可以是任意的类类型。
操作集合
(1)入栈push(obj):把数据元素obj插入堆栈。
(2)出栈pop():出栈, 删除的数据元素由函数返回。
(3)取栈顶数据元素getTop():取堆栈当前栈顶的数据元素并由函数返回。
(4)非空否notEmpty():若堆栈非空则函数返回true,否则函数返回false。
三、顺序栈
顺序存储结构的堆栈称作顺序堆栈。
顺序堆栈的存储结构示意图如图所示。
四、顺序栈实现
//设计Stack接口 public interface Stack { //入栈 public void push(Object obj) throws Exception; //出栈 public Object pop() throws Exception; //得到栈顶元素 public Object getTop() throws Exception; //判断栈是否为空 public boolean isEmpty(); }
//实现SquenceStack public class SquenceStack implements Stack{ //对象数组 Object stack[]; //栈顶 int top; //默认最大长度 private final int defalutSize=10; //最大长度 int maxSize; //无参构造方法 public SquenceStack() { init(defalutSize); } //指定最大长度的构造方法 public SquenceStack(int size) { init(size); } //初始化 public void init(int size) { this.maxSize=size; this.top=0; stack=new Object[size]; } @Override public void push(Object obj) throws Exception { if(top==maxSize) { throw new Exception("堆栈已满!"); } stack[top]=obj; top++; } @Override public Object pop() throws Exception { if(isEmpty()) { throw new Exception("堆栈为空,不能删除!"); } top--; return stack[top]; } @Override public Object getTop() throws Exception { if(isEmpty()) { throw new Exception("堆栈为空!"); } return stack[top-1]; } @Override public boolean isEmpty() { return top==0; } }
拓展:Java中栈与堆的区别:
栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量。在java中,所有基本类型和引用类型都在栈中存储。栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域)。
堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中。在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象。所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用。
hashCode与对象之间的关系:
如果两个对象的hashCode不相同,那么这两个对象肯定也不同。
如果两个对象的hashCode相同,那么这两个对象有可能相同,也有可能不同。
判断两个对象是否相同,只有一种方法,就是使用==符号。