30.包含main函数的栈

在这里插入图片描述

分析

第一反应可能是添加一个成员变量存放最小元素的值,每次压入一个新元素进栈时,如果该元素比当前元素小,则更新最小元素。

但是如果当前最小元素被弹出了栈,如何得到下一个最小的元素呢?

因此,我们发现,仅仅添加一个成员变量存放最小元素时不够的;
也就是说当最小元素被弹出栈后,我们希望得到次最小元素。

因此在压入这个最小元素之前,我们要把次小元素保存起来。

那么我们是不是可以把每次的最小元素(也就是之前的最小元素和新压入元素两者间的最小值)都保存在另外一个辅助栈中。

在这里插入图片描述

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {

    }
    
    void push(int x) {
        s.push(x);//入数据栈
        if(m.empty() || x<=m.top()){
            m.push(x);//入辅助栈
        }
    }
    
    void pop() {
        if(s.top() == m.top()){
            m.pop();//如果数据栈当前栈顶元素就是最小值,辅助栈弹出该元素
        }
        s.pop();//数据栈也弹出该元素
    }
    
    int top() {
        return s.top();
    }
    
    int min() {
        return m.top();
    }

private:
    stack<int> s,m;//别忘了成员变量

};

/**
 * 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();
 */

[参考文档] 剑指offer第二版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值