栈 Stack
- 栈是一种线性结构
- 相比数组,栈对应的操作是数组的子集
- 只能从一端添加元素,也只能从一端取出元素
- 这一端称为栈顶
- 栈是一种后进先出的数据结构
栈的应用
- 无处不在的Undo操作(撤销)
- 括号匹配(编译器)
- 程序调用的系统栈
funA(){ 1 ... 2 B() 3 ... } | funB(){ 1 ... 2 C() 3 ... } | funC(){ 1 ... 2 ... 3 ... } |
栈的实现及复杂度分析
Stack<E> <---implement--- ArrayStack<E>
- void push(E) O(1) 均摊
- E pop() O(1) 均摊
- E peek() O(1)
- int getSize() O(1)
- boolean isEmpty() O(1)
实现源码:
public class ArrayStack<E> implements Stack<E>{private Array<E> array;// 有参构造public ArrayStack(int capacity){array = new Array<>(capacity);}// 默认构造public ArrayStack(){this(10);}// 判断栈是否为空@Overridepublic boolean isEmpty(){return array.isEmpty();}// 判断栈是否已满public boolean isFull(){return array.isFull();}// 获取栈的容量@Overridepublic int getCapacity(){return array.getCapacity();}// 获取栈内元素个数@Overridepublic int getSize(){return array.getSize();}// 查看栈顶元素@Overridepublic E peek(){return array.getLast();}// 栈顶元素出栈@Overridepublic E pop(){return array.removeLast();}// 入栈@Overridepublic void push(E e){array.addLast(e);}@Overridepublic String toString(){StringBuilder res = new StringBuilder();res.append(String.format("Stack Size = %d, Capacity = %d\n", array.getSize(), array.getCapacity()));res.append("Stack [");for (int i = 0; i < array.getSize(); i++) {res.append(array.get(i));if (i != array.getSize() - 1)res.append(", ");}res.append("] top");return res.toString();}public static void main(String[] args){ArrayStack<Integer> stack = new ArrayStack<>();for (int i = 0; i < 10; ++i) {stack.push(i);System.out.println(stack);if (i % 3 == 2) {stack.pop();System.out.println(stack);}}}
}