(min函数的作用是返回栈内最小值)

首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack。至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考虑用额外的空间。

如果直接使用一个int变量存储当前的最小值,我们的确可以获得最小值,但是当栈pop()了以后,我们无法获得次小值。我们需要一个数据结构来动态保存每个时刻的最小值,每当push()和pop()的时候,同样更新这个数据结构,而且时间复杂度也是O(1),那么看来需要额外O(n)的空间了。可以选择栈或者一个链表(实质上当作栈使用)。我们使用一个辅助栈来实现,该栈和主栈的大小相同,栈顶存放的是当前栈内的最小值。

书中方法:

public class StackContainingMinFunc{
    Stack<Integer> origin = new Stack<Integer>();
    Stack<Integer> sup = new Stack<Integer>();
    public void push(int item){
        origin.push(item);
        if(sup.isEmpty()){
            sup.push(item);
        }else sup.push(sup.peek()<item ? sup.peek() : item);
    }

    public int pop(){
        assert(origin.size()>0 && sup.size()>0);
        sup.pop();
        return origin.pop();
    }

    public int min(){
        assert(origin.size()>0 && sup.size()>0);
        return sup.peek();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StackContainingMinFunc s = new StackContainingMinFunc();
        s.push(5);
        System.out.println(s.min());
        s.push(4);
        System.out.println(s.min());
        s.push(3);
        System.out.println(s.min());
        s.push(6);
        System.out.println(s.min());
        s.pop();
        System.out.println(s.min());
        s.pop();
        System.out.println(s.min());
        s.pop();
        System.out.println(s.min());
    }

}
01-23 02:34