剑指 Offer 30. 包含min函数的栈C++(详解)

举报
莫浅子 发表于 2022/12/21 22:04:48 2022/12/21
【摘要】 ​ 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min();   --> 返回 -3.mi...

 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

方法

设置俩个栈,一个数据栈存放数据元素,另一个最小值栈,把最小的值放进去,

1、如果栈为空,直接x同时放入最小值栈数据栈,

2 、将要放进去的元素与最小值栈的栈顶元素进行比较,如果不满足小于最小值的栈顶,仍然放的是之前的最小值栈的栈顶元素,如果小于则把这个元素放到最小值栈上去

注意(代码的实现方式比较巧妙,如果插入的x大于最小值栈的栈顶元素,那么把此时最小值栈的栈顶元素赋值给x,最终统一的把x放进去就行)


编辑

实现代码

class MinStack {
public:
    stack<int>_date; 
    stack<int>_min;
    /** initialize your data structure here. */
    MinStack() {
    }
    
    void push(int x) {
        _date.push(x);   //将数据压入数据栈
        if(_min.empty())   _min.push(x);   //数据栈为空的时候直接插入
        else{
            if(x > _min.top())             //如果x大于最小栈的栈顶
               x = _min.top();
            _min.push(x);       //将x push进最小的栈
        }
    }
    
    void pop() {              //数据栈与最小栈同时弹出
        _date.pop();
        _min.pop();

    }
    
    int top() {
        return _date.top();

    }
    
    int min() {
        return _min.top();
    }
};


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。