力扣oj链接:https://leetcode.cn/problems/min-stack/
一、解题思路
题意是找出栈中最小的那个元素。既然要找出最小的元素,那么我们就需要对比。这里我们先定义两个栈,一个stack,一个minStack。在你压栈的过程中最小值是会变化的,具体思路如下图:
现在有一串数字,-2 ,0 ,3 ,-4,首先我们将-2分别入这stack中,
![](https://i-blog.csdnimg.cn/blog_migrate/5a1afdf9752d5789dd355eac8a355914.png)
可以看见stack里面只有一个-2,那么这个就是stack栈里面的最小值,那么我们就将-2放入minStack中,然后我们继续将这串数字入stack栈,
![](https://i-blog.csdnimg.cn/blog_migrate/dc21fd39dbc605fc338c6caefea23ebe.png)
将0和3分别入栈,与minStack栈顶元素对比,我们发现,这两个值比-2大,那么我们就不应该将这两个值放入minStack中,然后我们将-4入栈,发现-4<-2,那么此时我们就应该将-4入栈,
![](https://i-blog.csdnimg.cn/blog_migrate/c863216d3073b2581f16a525643258ef.png)
我们可以发现,此时的最小值是-4,也就是minStack里面的栈顶元素。
注意:此题考察的是求栈最小值,比如这个例子,如果-4出stack栈了,那么-4就不是这个栈里的最小值了,-4出了stack栈,那么-4也应该出minStack栈。
二、具体编码
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int val) {
stack.push(val);
if (minStack.empty()){
minStack.push(val);
}else {
if (val <= minStack.peek()) {
minStack.push(val);
}
}
}
public void pop() {
if (!stack.empty()){
int val = stack.pop();
//维护最小栈
if (val == minStack.peek()) {
minStack.pop();
}
}
}
public int top() {
if (!stack.empty()){
return stack.peek();
}
return -1;
}
public int getMin() {
return minStack.peek();
}
}