分析
栈是一种操作受限的线性表,因此它的操作是线性表的子集,它只能从一端添加元素,从一端取出元素,这一端称为栈顶,它是一种后进先出的数据结构(First In First Out:FIFO)
应用场景
- 各各软件中的undo操作(撤销)
- 程序中的函数调用过程(实质压栈出栈的过程)
- 编译器中分析括号匹配
- ...
栈的基本操作:
- void push(E)
- E pop()
- E peek()
- int getSize()
- boolean isEmpty()
顺序栈
实现代码:
public interface Stack<T> {
/**
* 获取栈中元素个数
* @return
*/
int getSize();
/**
* 判断栈是否为空
* @return
*/
boolean isEmpty();
/**
* 将元素压入栈中
* @param e
*/
void push(T e);
/**
* 弹出栈顶元素
* @return
*/
T pop();
/**
* 返回栈顶元素
* @return
*/
T peek();
}
public class ArrayStack<T> implements Stack<T> {
public ArrayList<T> array;
private ArrayStack(int capacity){
array = new ArrayList(capacity);
}
public ArrayStack(){
array = new ArrayList();
}
@Override
public int getSize() {
return this.array.getSize();
}
@Override
public boolean isEmpty() {
return this.array.isEmpty();
}
public int getCapacity(){
return this.array.getCapacity();
}
@Override
public void push(T e) {
this.array.addLast(e);
}
@Override
public T pop() {
return this.array.removeLast();
}
@Override
public T peek() {
return this.array.getLast();
}
@Override
public String toString() {
StringBuffer rs = new StringBuffer();
rs.append(String.format("Stack: size = %d, capacity = %d\n", this.array.getSize(), this.array.getCapacity()));
rs.append("[");
for (int i = 0; i < this.array.getSize(); i ++){
rs.append(this.array.get(i));
if (i != this.array.getSize() -1){
rs.append(", ");
}
}
rs.append("] Top");
return rs.toString();
}
}
链栈
练习
遇到左括号压入栈
遇到右括号弹出栈
顺序栈的各种操作时间复杂度分析
- 添加操作
- push:O(1)
- resize:O(n)
- 删除操作
- E pop():O(1)
- 查找操作
- peek():O(1)