(一)栈 Stack
概念:栈也是一种线性结构,相比数组,栈对应的操作是数组的子集,只能从栈顶添加元素,也只能从栈顶取出元素。栈是一种后进先出的数据结构Last In First Out (LIFO)。
(二)栈的实现
从用户的角度看,并不关心具体底层实现,只需要支持操作即可, 故只要stack接口实现功能如下:
public interface Stack<E> { //栈的接口
int getSize();
boolean isEmpty();
void push(E e);
E pop();
E peek();
}
基于动态数组实现栈:
- 声明
public class ArrayStack<E> implements Stack<E>{ //基于动态数组的实现 Array<E> array; public ArrayStack(int capacity){ array = new Array<>(capacity); } public ArrayStack(){ array = new Array<>(); } public int getCapacity(){ //只有动态数组才拥有获取容积的方法 return array.getCapacity(); } //栈的输出方式 @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append("Stack: "); res.append("["); 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(); } }
- 获取栈的大小
@Override public int getSize(){ return array.getSize(); }
- 判断栈是否为空
@Override public boolean isEmpty(){ return array.isEmpty(); }
- 往栈中添加元素e
@Override public void push(E e){ array.addLast(e); }
- 删除栈顶元素
@Override public E pop(){ return array.removeLast(); }
- 获取栈顶元素
@Override public E peek(){ return array.getLast(); }
(三)栈的复杂度分析
- ArrayStack<E>
- int getSize(); O(1)
- boolean isEmpty(); O(1)
- void push(E e); O(1)均摊
- E pop(); O(1)
- E peek(); O(1)
(四)栈的应用
- undo操作(撤销)- 编辑器
- 系统调用栈 - 操作系统
- 括号匹配 - 编译器
//import java.util.Stack; public class Solution { public boolean isValid(String s){ //Stack<Character> stack = new Stack<>();//内部类 ArrayStack<Character> stack = new ArrayStack<>();//自己封装的类 for (int i = 0; i < s.length(); i++){ char c = s.charAt(i); if (c == '(' || c == '[' || c == '{'){ stack.push(c); }else{ if (stack.isEmpty()) return false; char topChar = stack.pop(); if (c == ')' && topChar != '(') return false; if (c == ']' && topChar != '[') return false; if (c == '}' && topChar != '{') return false; } } return stack.isEmpty(); } }