/**
相较于传统的栈额外需要常数级时间复杂度获取栈中最小值
双栈法:
主栈,普通栈的功能,push、pop、top均在主栈进行
辅助栈,记录当前状态主栈的最小值,即每当主栈状态发生改变时,辅助栈也要做相应更改
辅助栈:
push操作: 判断push后主栈的最小值,即辅助栈栈顶元素与待添加元素相比,将较小的值加入辅助栈中
pop操作: 辅助栈也做相应pop操作,即减少一个状态
*/
class MinStack {
/**
相较于传统的栈额外需要常数级时间复杂度获取栈中最小值
双栈法:
主栈,普通栈的功能,push、pop、top均在主栈进行
辅助栈,记录当前状态主栈的最小值,即每当主栈状态发生改变时,辅助栈也要做相应更改
辅助栈:
push操作: 判断push后主栈的最小值,即辅助栈栈顶元素与待添加元素相比,将较小的值加入辅助栈中
pop操作: 辅助栈也做相应pop操作,即减少一个状态
*/
//主栈
private Deque<Integer> stack;
//辅助栈
private Deque<Integer> minStack;
public MinStack() {
stack = new ArrayDeque<>();
minStack = new ArrayDeque<>();
}
//主栈直接添加,辅助栈保存当前状态主栈最小值
public void push(int val) {
//主栈直接添加元素
stack.push(val);
//辅助栈添加当前主栈状态的最小值
if(minStack.isEmpty() || val <= minStack.peek()) {
minStack.push(val);
} else {
minStack.push(minStack.peek());
}
}
//删除主栈元素的同时,弹出主栈顶部元素
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/