定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
class MinStack {
Stack<Integer> s1; //存储压入的元素
Stack<Integer> s2; //存储s1中的非严格降序元素(栈顶是当前的最小元素),可重复
public MinStack() {
s1 = new Stack<>();
s2 = new Stack<>();
}
public void push(int x) {
s1.push(x);
//若s2为空或当前栈顶元素大于等于压入的元素,就把这个元素压入s2
if (s2.isEmpty() || s2.peek() >= x ){
s2.push(x);
}
}
public void pop() {
//若s1中栈顶元素等于s2栈顶元素,s1和s2都pop,否则只执行s1.pop()
// Integer的equals重写过,比较的是内部value的值, ==如果在[-128,127]会被cache缓存,超过这个范围则比较的是对象是否相同
if (s1.peek().equals(s2.peek())){
s2.pop();
}
s1.pop();
}
public int top() {
return s1.peek();
}
public int min() {
return s2.peek();
}
}