栈又叫做堆栈;是允许在同一端进行插入与删除操作的特殊线性表。其中执行插入删除操作的一段叫栈顶(Top),另一端为栈底(Bottom)。栈底固定,栈顶浮动。当栈内没有元素时,该栈叫做空栈。
插入过程叫做进栈(Push);
删除过程叫做出栈(Pop);
栈遵循FILO(First in Last Out),先入后出的原则。
示意图如下:
方法 | 功能描述 |
---|---|
push() | 向栈内压入一个数据,在栈的最下面 |
pop() | 弹出栈顶元素,出栈 |
peek() | 返回当前栈顶数据 |
首先定义栈的基本数据结构:
public class Stack<E>{ private Object[] data=null; private int maxSize; private int top=-1; Stack(){ this(10) } Stack(int initalSize){ if(initalSize>=0){ this.maxSize=initalSize; data=new Object(initalSize); top=-1; }else{ throw new RuntimeException("初始化大小不能小于0"+initalSize); } } }
该段代码定义了一个栈类,‘定义了一个数组data,用于存储数据;定义了一个maxSize,用于规定栈的最大容量;
定义了栈顶指针为-1;同时无参构造函数中,栈的默认大小为10,当然也提供了有参的构造方法,帮助其规定其他容量的栈。
//进栈,第一个元素top=0 public boolean push(E e){ if(top==maxSize-1){ throw new RuntimeException("栈已满,无法再继续入栈") }else{ data[++top]=e; return true; } }
进栈前首先要判断是否栈已经满了,要是满了,则压不了栈;注意top指针是从-1开始的,因此top==maxSize-1的时候就是栈已经满了;入栈就是data[++top]=e,(指针不断上移)然后返回true(因为该函数返回值是布尔值)。
出栈,从栈顶移除数据
public E pop(){ if(top==-1){ throw new RuntimeException("栈为空") }else{ return (E)data[top--]; } }
上面方法定义了pop(),注意这里是data[top–],先把数据移除去,再top减一
仔细推向一下,一开始top=-1;压入一个,top就是0了,也就是top要比maxSize小一个。
public E peek(){ if(top==-1){ throw new RuntimeException("栈为空") }else{ return (E)data[top]; } }
这个和pop()差不多