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

题目:实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、 Min(返回最小值的操作)的时间复杂度为O(1)
解决方法:使用两个栈_data和_min,_min做为辅助栈(每次压入_min的都是_data的最小值)。元素value入栈时,将value和_min栈顶元素做比较,如果value小于等于_min.top(),将value分别push到_data和_min,否则vlaue只push到_data;元素出栈时,将_data栈顶元素和_min栈顶元素做比较,如果_data.top()等于_min.top(),_data和_min都执行pop操作,否则只执行_data.pop() 。

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

template <typename T>class Stack
{
public:
    Stack()
    {}
    ~Stack()
    {}
    T& top()
    {
        return _data.top ();
    }
    const T& top()const
    {
        return _data.top ();
    }
    void push(const T& value)
    {
        //把新元素添加到辅助栈
        _data.push (value);

        //当新元素比之前的最小元素小时,把新元素插入到辅助栈里
        //否则把之前的最小元素重复插入辅助栈里
        if(_min.size () == 0 || value < _min.top ())
            _min.push (value);
        else
            _min.push (_min.top());
    }
    void pop()
    {
        if(_data.size () > 0 && _min.size () > 0)
            return ;
        _data.pop ();
        _min.pop ();
    }

    const T& min()const
    {
        if(!_min.empty ())
            return _min.top ();
    }

    bool empty()const
    {
        return _data.empty ();
    }
    size_t size()const
    {
        return _data.size ();
    }
    void Print()
    {
        while(!_data.empty ())
        {
            cout<<_data.top ()<<"->";
            _data.pop ();
        }
        cout<<endl;
        while(!_min.empty ())
        {
            cout<<_min.top ()<<"->";
            _min.pop ();
        }
        cout<<endl;
    }
private:
    stack<T> _data;
    stack<T> _min;
};

int main()
{
    Stack<int> s;
    s.push (1);
    s.push (2);
    s.push (3);
    s.push (4);
    s.push (5);
    s.push (6);
    s.Print ();
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值