剑指 Offer 30 包含min函数的栈

题目:可以用栈的数据结构。实现一个可以返回最小值的栈的api,有push pop top min方法。

public void push(int x)
public void pop()
public int top()
public int min()

思路:用两个栈stackA和stackB。

  1. 既然还需要实现一个栈的push和pop和top功能,所以这些元素肯定都要放到stackA中来用它来实现这些方法(因为stackA本来就是个栈)。那stackB自然用来实现min方法
  2. 当push时stackA先push一下,由于stackB里叠加的存放此刻的最小值,所以当stackB为empty或x小于等于stackB.peek()时就stackB再push一下。(x等于的时候也要push,否则当有两个一样的x情况下stackB最小的就放一个,那pop一下最小值就不对了,就出问题了)。
  3. 当pop时考虑stackA为empty的情况,当stackA不为empty时stackB也不为empty。当stackA.peek()为tempNum变量(要拿临时变量保存,否则两个.peek() 用 ‘==’ 比较的是对象,就出问题了)与stackB.peek()相等时,把stackB.pop()一下。然后stackA一定要pop,放到最后。
  4. top和min方法,考虑一下为empty的情况,分别返回stackA和stackB的peek()就好。
class MinStack {

    //类属性变量(对象类型)会初始化为null
    private Stack<Integer> stackA;
    private Stack<Integer> stackB;

    /** initialize your data structure here. */
    public MinStack() {
        stackA = new Stack<>();
        stackB = new Stack<>();
    }
    
    /*
    stackA实现一个栈的正常操作,stackB来可叠加地保存min值
     */
    public void push(int x) {
        stackA.push(x);
        //x等于也放入,要不pop时要pop两个相同的,如果只放一个就发生了错误
        if(stackB.isEmpty() || x <= stackB.peek()){
            stackB.push(x);
        }
    }

    public void pop() {
        if(stackA.isEmpty()){
            return;
        }
        //先用tempNum给接收过来,要不可能会出问题
        int tempNum = stackA.peek();
        if(tempNum == stackB.peek()){
            stackB.pop();
        }
        stackA.pop();
    }

    public int top() {
        if(stackA.isEmpty()){
            return -999;
        }
        return stackA.peek();
    }

    public int min() {
        if(stackA.isEmpty()){
            return -999;
        }
        return stackB.peek();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值