题目描述:
思路:
1.建立两个栈,一个是存储所有数据并可以正常实现push,pop,peek等函数的数据栈stack1,一个是存储stack1非严格降序的辅助栈stack2。stack2的栈顶元素始终是数据栈stack1中的最小元素。
2.在stack1执行push()函数入栈的时候,判断如果stack2为空,就也给stack2入栈该元素。当stack2不为空的时候,stack2只入栈比stack2栈顶元素小的元素。这样就保证了stack2的栈顶元素是最小的元素。
3.为了维护stack2的栈顶元素一直是最小的元素,在stack1出栈的时候,stack2也要做出相应的动作。
如果stack1出栈的元素比stack2栈顶元素大,则不做处理。
但如果stack1出栈的元素和stack2的栈顶元素相等,就要同时给stack2的栈顶元素出栈。
由于stack2入栈的规则是只入小的,也就是stack2内部相当于是降序的,而stack2存储的是最小值,所以stack1出栈的值不可能比stack2的栈顶元素小。
代码实现如下:
class MinStack {
Stack<Integer> stack1;
Stack<Integer> stack2;
/** initialize your data structure here. */
public MinStack() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int x) {
stack1.add(x);
if (stack2.empty() || stack2.peek() >= x) {
stack2.add(x);
}
}
public void pop() {
int val = stack1.pop();
if (stack2.peek() == val) {
stack2.pop();
}
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}