实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)

分析:栈的出栈和入栈操作都是时间复杂度O(1)的,问题主要是如何获得栈中所有元素的最小值。其实如果问题是数组中存入很多元素,取出元素中的最小值,时间O(1),那很简单,就是设置一个变量,每次存入数据的时候都和最小值变量比较,到最后取此变量值即可。但是在栈中,我们要求不管push或者pop多少次,此时直接取最小值要求依然O(1)。也很简单,在我们存数据的数据栈之外弄一个辅助栈,每次数据存入数据栈时,都将当前最小的值存入到辅助栈中(下面代码实现时进行了一点优化)。具体看如下代码。


#include<iostream>
#include<stack>
using namespace std;

template <class T>
class StackWithMin{
public:
    void Push(const T data){                //进栈函数
        _num.push(data);
        if(_min.empty()||data<=_min.top())  //辅助栈为空,或者有更小的值,将其存入辅助栈。注意是 <=
            _min.push(data);
    }
    void Pop(){
        if(_num.top()==_min.top())          //数据栈当前取出的元素是栈中最小的,则辅助栈也要弹出此元素
            _min.pop();
        _num.pop();
    }
    T Min(){                                //取当前最小元素
        if(!_min.empty())
            return _min.top();
    }
private:
    stack<T> _num;                          //数据栈
    stack<T> _min;                          //辅助栈
};

int main(){
    StackWithMin<int> s;
    s.Push(4);
    s.Push(3);
    s.Push(5);
    s.Push(2);
    cout<<s.Min()<<endl;
    s.Pop();
    cout<<s.Min()<<endl;
    return 0;
}

输出:

2

3


示意图:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值