问题描述
题目分析
此时肯定是获取不到的,因为需要你一个一个的去遍历.然后比较数组里的值,才能找出最小值
我们先看懂示例:
所以说通过一个栈我们是很难做到的
我们通过两个栈来实现一下
一个普通栈,一个最小栈.普通栈入栈和出栈都无所谓,一个数据在放到普通栈的同时,我们需要检查一下minstack,因为最小栈里面需要一直保存栈的最小值,普通栈我们先放一个-2,检查最小栈,没有元素,把-2再放到最小栈
下面再放0,把0放到普通栈,那0需不需要放到最小栈呢,我们需要看一下最小栈当前栈顶元素和0的大小,0并不小于-2,所以最小栈不放0
下面是-3,放入普通栈,那么-3放不放最小栈,-3小于-2,所以要放
在普通栈里当前的最小值就是-3,所以每次要获取最小值直接从最小栈里面拿就可以了
现在我们出栈,先出-3,现在最小值就变成了-2
我们每次出一个元素的时候一定要检查最小栈栈顶元素是不是-3,如果是,最小栈的-3也要出
如果不出最小栈的-3,我再获取普通栈的最小值,本来应该是-2的,但是拿到的还是-3,所以最小栈-3必须出出去
普通栈是用来进行出栈入栈等操作的
最小栈每次维护的都是最小值
假设现在我们又要存储一个-3
那现在这种情况,最小栈应不应该再放一个-3
得放
如果-3不放了
假设我们要出普通栈-3,最小栈的-3也要出
这样普通栈的最小值还是-3,最小栈保存的就不是最小值了
所以说当栈顶的值等于要放的值的时候也要放进来
完整代码
class MinStack { private Stack<Integer> stack; private Stack<Integer> minstack; public MinStack() { stack = new Stack<>(); minstack = new Stack<>(); } public void push(int val) { stack.push(val); if(!minstack.empty()){ int top = minstack.peek(); if(val <= top){ minstack.push(val); } }else{ minstack.push(val); } } public void pop() { int popVal = stack.pop(); if(!minstack.empty()){ int top = minstack.peek(); if(top == popVal){ minstack.pop(); } } } public int top() { return stack.peek(); } public int getMin() { return minstack.peek(); } }