一、题目描述
二、思路分析
- 整个操作的核心就在于有一个栈永远保存的都是每次有新元素入栈时当前栈中的最小值。
- 首先定义两个栈,s1和s2,s2就是那个最小栈。
- 当栈为空的时候直接入栈,两个都入栈。
- 当栈不为空时,判断要入栈的元素和当前栈顶元素的大小关系;
- 当s2的栈顶元素 > 要入栈的元素,直接入栈;
- 当s2的栈顶元素 < 要入栈的元素,就把s2的栈顶元素再入一遍栈;这里是为了s2的元素个数和s1保持一致。
- 如果s2的元素个数和s1不一致,那么进行出栈操作的时候,s2里的元素就会比s1少一个,我们的最小栈已经为空了,但是此时s1中还有最后一个元素。
- 其他的操作都和JDK自带的栈的操作一样
代码如下:
public class Code155 {
class MinStack {
private Stack<Integer> s1 = new Stack<>();
private Stack<Integer> s2 = new Stack<>();
public MinStack() {
}
public void push(int val) {
//s1直接入栈
s1.push(val);
//s2只保存最小值
if (s2.isEmpty()) {
s2.push(val);
} else {
//查看最小栈的栈顶元素
int peek = s2.peek();
//将待入栈元素和最小栈栈顶元素进行比较,值小的那个入栈
s2.push(Math.min(val,s2.peek()));
}
}
public void pop() {
s1.pop();
s2.pop();
}
public int top() {
return s1.peek();
}
public int getMin() {
return s2.peek();
}
}
}