栈 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);
}
// 判断栈是否为空
@Override
public boolean isEmpty()
{
return array.isEmpty();
}
// 判断栈是否已满
public boolean isFull()
{
return array.isFull();
}
// 获取栈的容量
@Override
public int getCapacity()
{
return array.getCapacity();
}
// 获取栈内元素个数
@Override
public int getSize()
{
return array.getSize();
}
// 查看栈顶元素
@Override
public E peek()
{
return array.getLast();
}
// 栈顶元素出栈
@Override
public E pop()
{
return array.removeLast();
}
// 入栈
@Override
public void push(E e)
{
array.addLast(e);
}
@Override
public 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);
}
}
}
}