[算法学习]栈中的最小值

32 篇文章 0 订阅
29 篇文章 10 订阅

问题描述: 实现栈的pop、push、 min (得到栈中最小值)方法。

解法与分析:
1. 由于每次压栈和出栈都可能会改变栈中的最小值,所以,我们增加一个存放最小值的栈。
2. 当出栈操作时,最小值的栈也出栈;(当然,必须判断栈是否为空)
3. 当压栈操作时,比较压栈元素值和最小栈的栈顶元素的大小,若比较小,则将它压入栈中,若不是,则将最小栈的栈顶元素重复压栈。(当然,必须判断栈是否为空)


参考代码如下

    private Stack<Integer> dataStack = new Stack<Integer>();
    private Stack<Integer> minStack = new Stack<Integer>();

    /**
     * 出栈
     * @return
     */
    public int pop()
    {
        if (minStack.isEmpty() && dataStack.isEmpty())
        {
            throw new EmptyStackException();
        }
        minStack.pop();
        return dataStack.pop();
    }

    /**
     * 压栈
     * @param item
     */
    public void push(int item)
    {
        dataStack.push(item);
        if(minStack.isEmpty()||item<minStack.peek())
        {
            minStack.push(item);
        }
        else
        {
            minStack.push(minStack.peek());
        }
    }

    /**
     * 取最小值
     * @return
     */
    public int min()
    {
        if(minStack.isEmpty())
        {
            throw new EmptyStackException();
        }
        return minStack.peek();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值