(1)辅助栈方法

使用两个栈维护数据,一个作为普通栈,一个保存历史最小值


public class Solution {
    //正常栈操作
    private Stack<Integer> stack = new Stack<Integer>();
    //保存最小值栈
    private Stack<Integer> mins = new Stack<Integer>();
    public void push(int node) {
         stack.push(node);
         //最小值栈为空或元素小于最小值栈顶元素则入栈
         if(mins.isEmpty() || node <= mins.peek())
             mins.push(node);
    }
    
    public void pop() {
    	//两个栈顶元素相同则最小值栈顶也需要弹出
         if(stack.peek().equals(mins.peek()))
             mins.pop();
         stack.pop();
    } 
    
    public int top() {
        return stack.peek();
    }
    
    public int min() {
        return mins.peek();
    }
}

(2)记录最小值方法


public class Solution {
    //正常栈操作
    private Stack<Integer> stack = new Stack<Integer>();
    //保存最小值
    int min;
    public void push(int node) {
        if (stack.isEmpty()) {
            min = node;
            stack.push(node - min);
        } else {
        	//栈中存放node-当前最小值的结果
            stack.push(node - min);
            //更新最小值
            if (node > min) {
                min = node;
            }
        }
    }
    
    public void pop() {
        int tmp = stack.pop();
        if (tmp < 0) {
            //出栈时,如果栈顶值大于零,说明上一个最小值和当前一样,不需要变动;
            //如果小于零,则上一个最小值=当前最小值-栈顶值(因为栈顶值=node-min)
            min = min - tmp;
        }
    } 
    
    public int top() {
    	//栈顶小于0,最小值在该位置发生变化,目前最小值为该位置元素值
        if(stack.peek() < 0){
            return min;
        }
        //正常还原元素值
        else{
            return stack.peek() + min;
        }
    }
    
    public int min() {
        return min;
    }
}