剑指Offer 30.包含min函数的栈
思路
用一个栈 stackData
来实现基本的功能,用另外一个单调栈 stackMin
来维护栈中的最小值。在单调栈中元素都是逐步递减的,栈顶元素一定是最小的。
向栈中添加元素
如果说当前添加的元素是x,先将该元素添加到stackData
中。然后判断stackMin
是否是空:
- 为空,就将当前元素加入
stackMin
中。 - 不为空:为了维护单调栈的单调性,我们要进行判断,如果说比栈顶元素大,说明没有必要将他添加到
stackMin
中,因为他不可能是当前栈中最小的元素。反之就将他添加进来
弹出栈顶元素
- 对于
stackData
正常弹出 - 而对于
stackMin
来讲,如果弹出的元素是栈顶,就要进行把它进行弹出,反之,不会
代码
class MinStack { private LinkedList<Integer> stackData; private LinkedList<Integer> stackMin; public MinStack() { stackData = new LinkedList<>(); stackMin = new LinkedList<>(); } public void push(int x) { stackData.add(x); if(stackMin.size() == 0) { stackMin.add(x); } else { if(stackMin.getLast() >= x) { stackMin.add(x); } } } public void pop() { int value = stackData.getLast(); stackData.removeLast(); if(value == stackMin.getLast()) { stackMin.removeLast(); } } // 获取栈顶元素 public int top() { return stackData.getLast(); } // 获取最小值 public int min() { return this.stackMin.getLast(); }}