设计一个有getMin功能的栈

设计一个有getMin功能的栈

【题目】

实现一个特殊的栈,在实现基本的栈功能的基础上,再实现返回栈中最小元素的操作

【要求】

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

【解决思路】

在设计上,我们使用两个栈来解决问题,使用空间换取时间复杂度上的最优解。一个栈用来存储我们当前栈中最小的元素;另外的一个栈用来实现我们的基本栈的操作,存储基本数据。

  • 数据压栈规则
    假设,当前要压入栈的数据为newNum,先将其压入到stackData.然后判断stackMin是否为空:
    1.如果为空:则将newNum压入到minStack
    2.如果不为空,则将newNum和minStack栈顶的数据进行比较,如果比它小,则把newNum压入到minStack中去
  • 数据出栈规则
    先从stackData中执行出栈操作,取出数据,然后将这个数据和当前最小数据进行比较,如果当前出栈的数据是当前最小数据,则在minStack也进行出栈即可。

【代码实现】

package study0224;

import java.util.Stack;

public class MyStrack1 {

    private Stack<Integer> strackData;
    private Stack<Integer> minData;

    public MyStrack1() {
        this.strackData = new Stack<Integer>();
        this.minData = new Stack<Integer>();
    }

    public void push(Integer newNum) {
        if (strackData.isEmpty()) {
            strackData.push(newNum);
            minData.push(newNum);
        } else {
            strackData.push(newNum);
            if (this.getMin() > newNum) {
                minData.push(newNum);
            }
        }
    }

    public int pop() {
        int popNum = strackData.pop();
        if(popNum == this.getMin()) {
            minData.pop();
        }
        return popNum;
    }

    public int getMin() {
        if (this.minData.isEmpty()) {
            throw new RuntimeException("min stack is null");
        }
        return minData.peek();
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值