stack,中文翻译为堆栈,其实指的是栈,heap,堆。这里讲的是数据结构的栈,不是内存分配里面的堆和栈。
栈是先进后出的数据的结构,好比你碟子一个一个堆起来,最后放的那个是堆在最上面的。
栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线性表的最大区别是数据的存取的操作,我们可以这样认为栈(Stack)是一种特殊的
线性表,其插入和删除操作只允许在线性表的一端进行,一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈
(Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈。
顺序栈
顺序栈,顾名思义就是采用顺序表实现的的栈,顺序栈的内部以顺序表为基础,实现对元素的存取操作,当然我们还可以采用内部数组实现顺序栈,在这里我们使用内部数据
组来实现栈
package com.demo.stack; public class SeqStack { private int top = -1; private int capacity = 10; private int[] array; private int size; public SeqStack(int capacity){ array = new int[capacity]; } public SeqStack(){ array = new int[this.capacity]; } public int size(){ return size; } public boolean isEmpty(){ return this.top == -1; } public void push(int data){ if(array.length == size){ addCapacity(size*2); } array[++top] = data; size++; } public int pop(){ if(isEmpty()){ return -1; } size--; array[top] = (Integer) null; return array[top--]; } public void addCapacity(int capacity){ if(capacity < size){ return; } int[] old = array; array = new int[capacity]; for(int i=0; i<size; i++){ array[i] = old[i]; } } }
链式栈
了解完顺序栈,我们接着来看看链式栈,所谓的链式栈(Linked Stack),就是采用链式存储结构的栈,由于我们操作的是栈顶一端,因此这里采用单链表(不带头结点)
作为基础,直接实现栈的添加,获取,删除等主要操作即可。
package com.demo.node; public class Node { public int data; public Node next = null; public Node(int data){ this.data = data; } public Node(int data, Node node){ this.data = data; this.next = node; } }
package com.demo.stack; import com.demo.node.Node; public class LinkedStack { private Node top; private int size; public LinkedStack(){ this.top = null; } public int size(){ return this.size; } public void push(int data) throws Exception{ if(this.top == null){ this.top = new Node(data); }else{ Node p = new Node(data,this.top); top = p; } size++; } public int pop(){ int data = top.data; top = top.next; size--; return data; } }