【数据结构 - 栈】:力扣题:实现一个最小栈

问题描述

155. 最小栈 - 力扣(LeetCode)

题目分析

 

 此时肯定是获取不到的,因为需要你一个一个的去遍历.然后比较数组里的值,才能找出最小值

我们先看懂示例:

所以说通过一个栈我们是很难做到的

我们通过两个栈来实现一下

 一个普通栈,一个最小栈.普通栈入栈和出栈都无所谓,一个数据在放到普通栈的同时,我们需要检查一下minstack,因为最小栈里面需要一直保存栈的最小值,普通栈我们先放一个-2,检查最小栈,没有元素,把-2再放到最小栈

 下面再放0,把0放到普通栈,那0需不需要放到最小栈呢,我们需要看一下最小栈当前栈顶元素和0的大小,0并不小于-2,所以最小栈不放0

下面是-3,放入普通栈,那么-3放不放最小栈,-3小于-2,所以要放

 在普通栈里当前的最小值就是-3,所以每次要获取最小值直接从最小栈里面拿就可以了

现在我们出栈,先出-3,现在最小值就变成了-2

 我们每次出一个元素的时候一定要检查最小栈栈顶元素是不是-3,如果是,最小栈的-3也要出

 如果不出最小栈的-3,我再获取普通栈的最小值,本来应该是-2的,但是拿到的还是-3,所以最小栈-3必须出出去

普通栈是用来进行出栈入栈等操作的

最小栈每次维护的都是最小值

假设现在我们又要存储一个-3

那现在这种情况,最小栈应不应该再放一个-3

得放

如果-3不放了

假设我们要出普通栈-3,最小栈的-3也要出

 这样普通栈的最小值还是-3,最小栈保存的就不是最小值了

所以说当栈顶的值等于要放的值的时候也要放进来

完整代码

class MinStack {

    private Stack<Integer> stack;
    private Stack<Integer> minstack;


    public MinStack() {

        stack = new Stack<>();
        minstack = new Stack<>();
        
    }
    
    public void push(int val) {
        stack.push(val);
        if(!minstack.empty()){
            int top = minstack.peek();
            if(val <= top){
               minstack.push(val); 
            }

        }else{
            minstack.push(val);

        }

    }
    
    public void pop() {
        int popVal = stack.pop();
        if(!minstack.empty()){
             int top = minstack.peek();
             if(top == popVal){
                 minstack.pop();
             }
        }
    }
    
    public int top() {
        return stack.peek();

    }
    
    public int getMin() {
        return minstack.peek();

    }
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K稳重

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值