Stack-----155. Min Stack

原题目

简单就是维护两个栈就行了,但是看到讨论区的一个栈实现也是挺有意思的,记录一下

two stack



public class MinStack{
    Stack<Integer> stack1=new Stack<>();
    Stack<Integer> stack2=new Stack<>();
    int min=Integer.MAX_VALUE;
    public void push(int a){
        stack1.push(a);
        if(a<min){
            min=a;
            stack2.push(min);
        }
    }
    public int pop(){
        int a=stack1.pop();
        if(a==min){
            stack2.pop();
        }
    }
    public int top(){
        return stack1.peek();
    }
    public int getMin(){
        if(!stack2.isEmpty()){
            return stack2.peek();
        }else {
        }
    }
}

老实说这样漏洞是没有判断栈是否已经为空的情况,要是使用两个栈的话这样的情况就会多很多。

one stack

public class MinStack {
    int min = Integer.MAX_VALUE;
    Stack<Integer> stack = new Stack<>();

    //每次压栈之前要把前面部分数据的最小值放进去
    public void push(int x) {
        if (x <= min) {
            stack.push(min);
            min = x;
        }
        stack.push(x);
    }
    //这两个操作是最重要的,假如是弹出的是当前部分的最小值,就要取出在前面部分被压入的最小值
    public void pop() {
        if (stack.pop() == min) {
            min = stack.pop();
        }
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return min;
    }
}

同样是没有判断空的情况,但是这里比较巧妙地把最小值和真正的值放进了一个栈中,节省了空间,还是比较容易理解的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值