设计一个有getMin功能的栈

设计一个有getMin功能的栈

要求:

  1. pop、push、getMin操作的时间复杂度都是O(1)
  2. 设计的栈可以使用现成的栈结构

本题其实就是要设计一个方法,可以随时查找到栈中的最小值,可以使用两个栈来解决这个问题,一个栈用来保存数据,另一个栈用来保存最小值。

具体思路:

  1. 有一个数据date入栈时,先将date压入date栈,然后判断min栈是否有数据,如果没有数据直接将date压入min栈。
  2. 如果min栈中有数据,那么查看栈顶的数据,如果大于或者等于date,将date压入min栈;如果小于date,不进行任何操作。
  3. 出栈时,判断date栈中是否有数据,如果有数据,将数据弹出,并判断弹出的数据是否等于min栈顶的数据,如果等于,将min栈弹出一个数据。
  4. 如果弹出的数据大于min栈顶的数据,不进行任何操作。
  5. 查找栈中的最小值只需要调用min栈的peek方法即可。
public class MinStack {
    private Stack<Integer> dateStack = new Stack<>();
    private Stack<Integer> minStack = new Stack<>();

    public void push(Integer date){
        dateStack.push(date);
        if(minStack.isEmpty()){
            minStack.push(date);
        }else{
            Integer peek = minStack.peek();
            if(peek >= date){
                minStack.push(date);
            }
        }

    }

    public Integer pop() throws Exception {
        if(!dateStack.isEmpty()){
            Integer value = dateStack.pop();
            if(value.equals(minStack.peek())){
                minStack.pop();
            }
            return value;
        }
        throw new Exception("Stack isEmpty!");
    }
    public Integer getMin() throws Exception {
        if(!minStack.isEmpty()){
            return minStack.peek();
        }
        throw new Exception("Stack isEmpty!");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值