java实现最小栈

实现一个栈,该栈带有出栈(pop)、入栈(push)和取最小元素(getMin)3个方法。3个方法时间复杂度都是O(1)。

以{4,9,7,3,8,5}入栈为例。下图两个栈,第一个栈stack1用来存储所有元素,第二栈stack2用来存储最小元素。

  1. 对于入栈(push)操作,当第一个元素4入stack1栈时,同时入stack2栈。在后续元素入stack1时,与stack2的栈顶元素比较,若该元素小于栈顶元素,则表明该元素更小,入stack2栈,否则不入栈。如图,9和7比4大,不入stack2栈,3比4小,入stack2栈。
  2. 对于出栈(pop)操作,若出栈的元素同时也是stack2栈的栈顶元素,则stack2的栈顶元素也出栈。
  3. 对于取最小元素(getMin)操作,返回stack2的栈顶元素。

public class MinStack {
    private Stack<Integer> stack1 = new Stack<>();
    private Stack<Integer> stack2 = new Stack<>();

    private int pop() throws Exception{
        throwException();
        //出栈元素也是stack2的栈顶元素
        if (stack1.peek().equals(stack2.peek())){
            stack2.pop();
        }
        return stack1.pop();
    }

    private void push(int item){
        if (stack2.empty()){
            stack2.push(item);
        }else {
            //入栈元素比stack2的栈顶元素更小,如stack2栈
            if (stack2.peek() > item){
                stack2.push(item);
            }
        }
        stack1.push(item);
    }

    private int getMin() throws Exception{
        throwException();
        return stack2.peek();
    }

    private void throwException() throws Exception{
        if (stack1.empty()){
            throw new Exception("栈中元素为空");
        }
    }

    public static void main(String[] args) throws Exception{
        MinStack minStack = new MinStack();
        minStack.push(4);
        minStack.push(9);
        minStack.push(7);
        minStack.push(3);
        minStack.push(8);
        minStack.push(5);
        System.out.println(minStack.getMin()); //3
        System.out.println(minStack.pop()); //5
        System.out.println(minStack.pop()); //8
        System.out.println(minStack.pop()); //3
        System.out.println(minStack.getMin()); //4
        System.out.println(minStack.pop()); //7
        System.out.println(minStack.pop()); //9
        System.out.println(minStack.pop()); //4

    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值