在观看此篇博文之前必须会的前置知识:
线性表:一次保存单个
同类型
元素,多个元素之间逻辑上连续
例如:数组,链表,栈,队列,字符串(内部就是char[])
栈和队列其实是操作受限的线性表
上述讲的数组也罢,链表也罢,既可以在头部插入和删除,也能在尾部插入和删除,甚至可以在任意位置都可以插入和删除。
"栈和队列"只能在一端插入元素和删除元素
先进后出,后进先出的线性表 (LIFO)
添加元素和删除元素的一端称为栈顶,另一端称为栈底。
可以把栈看成一个水杯,只能从一端插入元素,也只能从这一端取出元素(栈顶)。
1.无处不在的undo(撤销)操作
2.操作系统栈
1. 基于数组实现的栈 -顺序栈
2.基于链表实现的栈 -链式栈
3.栈的三个核心操作
1.括号匹配问题
链接如下:20.有效的括号
解题思路:
解题步骤:
详细代码:
class Solution {
public boolean isValid(String s) {
Deque<Character> stack = new LinkedList<>();
char[] array=s.toCharArray();
for(int i=0;i<array.length;i++){
if(array[i]=='('){
stack.push(')');
}else if (array[i] == '['){
stack.push(']');
}else if (array[i] == '{'){
stack.push('}');
}
else{
if(stack.isEmpty() || stack.pop()!=array[i] ){
return false;
}
}
}
return stack.isEmpty();
}
}
2.最小栈问题
链接如下:155.最小栈
解题思路:
详细代码:
class MinStack {
Deque<Integer> xStack;
Deque<Integer> minStack;
public MinStack() {
xStack = new LinkedList<Integer>();
minStack = new LinkedList<Integer>();
minStack.push(Integer.MAX_VALUE);
}
public void push(int x) {
xStack.push(x);
minStack.push(Math.min(minStack.peek(), x));
}
public void pop() {
xStack.pop();
minStack.pop();
}
public int top() {
return xStack.peek();
}
public int getMin() {
return minStack.peek();
}
}
创建栈或者队列的时候,我们最好都使用Deque接口下的LinkedList<>()类,这个实现类既实现了栈的诸多个抽象方法以及队列的抽象方法,所以不管是栈或者是队列都可以使用这个实现类。