> 文档中心 > 剑指Offer 30.包含min函数的栈

剑指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();    }}