题目:设计一个可以常数时间获取最小值的栈
示例:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
思考:
public class MinStack {
/**
* 栈1:数据栈,正常压入弹出
*/
private LinkedList<Integer> stack1;
/**
* 栈2:辅助栈,栈顶保持栈1中的最小值
*/
private LinkedList<Integer> stack2;
public MinStack() {
stack1 = new LinkedList<>();
stack2 = new LinkedList<>();
}
public void push(int x) {
// 栈2压入:1.x大就压入min;2.x小就压入x
if (stack2.isEmpty() || x <= getMin()) {
stack2.push(x);
}
if (x > getMin()) {
stack2.push(getMin());
}
// 栈1每次正常进栈
stack1.push(x);
}
public void pop() {
if (stack1.isEmpty()) {
throw new RuntimeException("MinStack is empty");
}
// 出栈是两个辅助栈都要出
stack1.pop();
stack2.pop();
}
public int top() {
if (stack1.isEmpty()) {
throw new RuntimeException("MinStack is empty");
}
return stack1.peek();
}
public int getMin() {
if (stack2.isEmpty()) {
throw new RuntimeException("MinStack is empty");
}
return stack2.peek();
}
}