题目描述:![]()
解题思路:
实现最小栈需要借用一个辅助栈 min_stack,用于存获取 stack 中最小值。
算法流程:
push() 方法: 每当push()新值进来时,如果 小于等于 min_stack 栈顶值,则一起 push() 到 min_stack,即更新了栈顶最小值;
pop() 方法: 判断将 pop() 出去的元素值是否是 min_stack 栈顶元素值(即最小值),如果是则将 min_stack 栈顶元素一起 pop(),这样可以保证 min_stack 栈顶元素始终是 stack 中的最小值。
getMin()方法: 返回 min_stack 栈顶即可。
min_stack 作用分析:
min_stack 等价于遍历 stack所有元素,把升序的数字都删除掉,留下一个从栈底到栈顶降序的栈。
相当于给 stack 中的降序元素做了标记,每当 pop() 这些降序元素,min_stack 会将相应的栈顶元素 pop() 出去,保证其栈顶元素始终是 stack 中的最小元素。
代码:
class MinStack { private Stack<Integer> stack; private Stack<Integer> min_stack; public MinStack() { stack=new Stack<>(); min_stack=new Stack<>(); } public void push(int val) { stack.push(val); if(min_stack.isEmpty()||val<=min_stack.peek()){ min_stack.push(val); } } public void pop() { if(stack.pop().equals(min_stack.peek())){ min_stack.pop(); } } public int top() { return stack.peek(); } public int getMin() { return min_stack.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(); */