题目链接
最小栈
题目描述
注意点
- pop、top 和 getMin 操作总是在 非空栈 上调用
解答思路
- 由于栈先进后出的特点,对于任意一次入栈操作,只要该元素未被弹出,则其前面插入的元素一定都还在栈中,所以每次入栈时只需要根据其前一次入栈的元素进行比较就可以推出当前栈中最小元素,而不需要多次判断大小
- 使用辅助栈存储栈中此时最小元素,如果当前元素大于辅助栈栈顶元素,则不对辅助栈做操作,否则辅助栈也同样入栈;在主栈元素弹出的同时与辅助栈栈顶元素进行判断,如果是栈顶元素则辅助栈也同样出栈,保证辅助栈栈顶元素始终为栈中最小元素
代码
class MinStack {
// 主栈存元素
Deque<Integer> mainDeque;
// 辅助栈存最小值
Deque<Integer> helperDeque;
public MinStack() {
mainDeque = new LinkedList<>();
helperDeque = new LinkedList<>();
}
public void push(int val) {
mainDeque.push(val);
if (helperDeque.isEmpty() || val <= helperDeque.peek()) {
helperDeque.push(val);
}
}
public void pop() {
int res = mainDeque.pop();
if (res == helperDeque.peek()) {
helperDeque.pop();
}
}
public int top() {
return mainDeque.peek();
}
public int getMin() {
return helperDeque.peek();
}
}
关键点
- 栈先进后出的特点