目录
栈和队列使操作受限制的线性表,本质上栈和队列没啥不同,可以相互转换。
栈:一种特殊的线性表,其只允许在指定的一端进行查如何删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守后进先出(LIFO)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,push。
出栈:栈的删除操作叫做出栈,pop。
查看栈顶元素peek,只取值,不删除。
栈的实现根据实用的内部结构不同分为顺序栈和链式栈,顺序栈的内部还是动态数组,规定只能从数组的末尾进行插入和删除,链式栈的内部是链表,规定在链表的尾部进行插入和删除。
顺序栈的基础构造和动态数组几乎完全一样。主要实现四个方法,pop,push,peek,toString。
push方法就是相当于动态数组的尾插法,也要考虑到是否扩容。pop方法就是在在栈中有存储时也就是size!=0,存储最后一位元素然后把它删除并且返回。peek就是返回最后一位元素的值不进行其他操作。
- public class stack {
- private int size;
- private int[] data;
- public stack(){
- this(10);
- }
- public stack(int capacity){
- this.data = new int[capacity];
- }
- public void push(int val){
- this.data[size] = val;
- size++;
- if(size>data.length){
- this.data = Arrays.copyOf(data,data.length>>1);
- }
- }
- public int pop() throws NoSuchFieldException {
- if(size ==0){
- throw new NoSuchFieldException("stack is Null!");
- }
- int i = this.data[size-1];
- size--;
- return i;
- }
- public int peek() throws NoSuchFieldException {
- if(size ==0){
- throw new NoSuchFieldException("stack is Null!");
- }
- int i = this.data[size-1];
- return i;
- }
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder("[");
- for(int i