【Java实现】剑指Offer30——包含min函数的栈(LeetCode155:最小栈,左神基础班的白给题)

图片来自力扣
数组、栈、队列的互相实现,都是白给题哦,链接如下:
【Java实现】剑指Offer09——用两个栈实现队列(左神基础班的白给题)


题意分析:

实现一个栈,包含返回栈中最小元素的功能

思路分析:

设计两个栈结构dataminmin栈用来存最小值,能够做到getMin也是O(1),也就是从第二个栈顶弹出

data栈每次压入一个数,去min栈判断:如果min空,则也压入;如果不为空,则判断min栈顶的值

两种设计方法:

  1. 对齐压入:无论每次压入的数是不是最小值,min栈都压入一个数,这样出栈可以无脑出
  2. 不对齐压入:如果压入时,不是最小值,就不压入了;出栈时判断,如果两个栈顶相同,则同出,否则只有data栈出

需要注意!
一定要保证同步,也就是不能使一个栈出现空的情况!

情况1的代码:

class MinStack {
    private Stack<Integer> data;
    private Stack<Integer> min;

    /** initialize your data structure here. */
    public MinStack() {
        data=new Stack<>();
        min=new Stack<>();
    }
    
    public void push(int x) {
        data.push(x);
        if(min.isEmpty() || min.peek() >= x) {
            min.push(x);
        } else {
            min.push(min.peek());
        }
    }
    
    public void pop() {
        if(data.isEmpty() || min.isEmpty()) {
            //throw new RuntimeException("stack is empty");
            return;
        }
        data.pop();
        min.pop();
    }
    
    public int top() {
        return data.peek();
    }
    
    public int min() {
        return min.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.min();
 */

情况2的代码:

class MinStack {
    Stack<Integer> data,min;
    /** initialize your data structure here. */
    public MinStack() {
        data=new Stack<>();
        min=new Stack<>();
    }
    
    public void push(int x) {
        data.push(x);
        if(min.isEmpty() || min.peek() >= x) {
            min.push(x);
        } 
    }
    
    public void pop() {
        if(data.pop().equals(min.peek())) {
            min.pop();
        }
    }
    
    public int top() {
        return data.peek();
    }
    
    public int getMin() {
        return min.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

注意:这里得到一条经验:
当出现比较时,能用equals尽量不用==,对于这道题,Integer是包装类,比较的是对象的地址,当数值过大时会出现问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值