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

来源:互联网 发布:网络骚扰电话怎么举报 编辑:程序博客网 时间:2024/05/19 03:21

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

解法:定义两个栈成员变量_s1和_s2, _s1作为主栈,存放该栈的元素;
_s2作为副栈,其中_s2的栈顶元素,记录主栈_s1当前所有元素中的最小值;
每当_S1中的元素出栈时,都要和_s2的元素做对比,如果_s1当前出栈的元素就是其当前_s1所有元素的最小值,即就是_s2的栈顶元素,那么_s1在栈顶出栈,此时_S1的栈中最小值已经改变;所以此时也要将_s2的最小值更新,将_s2的栈顶元素出栈;

在压栈的时候,第一次压栈,两个栈都为空,所以,给主栈压入元素时吗,副栈也压入元素;之后给主栈压栈,每次都要和副栈的栈顶元素做对比,如果压入的元素比副栈的栈顶元素小,那么说明此时主栈的最小值已经变为入栈的这个元素,那么副栈就要更新栈顶元素,确保将此时的主栈的最小值记录在副栈的栈顶;当遇到主栈压栈的元素比副栈栈顶元素大时,说明主栈压入该元素,主栈的最小值不会改变,所以副栈不用更新栈顶元素,不用压入元素;在这样副栈只压小的元素,不压大的元素,就会节省栈的空间利用

#include<iostream>#include<stack>#include<cassert>using namespace std;template<class T>class StackMin{public:    void Push(const T& x)//压栈    {        _s1.push(x);        if (_s2.empty())        {            _s2.push(x);        }        else        {            if (x>_s2.top())            {                return ;            }            else//x<_s2.top()            {                _s2.push(x);            }        }    }    void Pop()//出栈    {         assert(!_s1.empty()&&!_s2.empty());         if (_s1.top()==_s2.top())         {             _s1.pop();             _s2.pop();         }         else         {             _s1.pop();         }    }    const T& Min()//返回栈里面的最小值    {         assert(!_s1.empty()&&!_s2.empty());         return _s2.top();    }private:    stack<T> _s1;//主栈,存放栈的数据    stack<T> _s2;//副栈,这个栈的【栈顶】记录【当前栈里面元素的最小值】};int main(){    StackMin<int>  s;    s.Push(6);    s.Push(2);    s.Push(3);    s.Push(1);    s.Push(9);    cout<<s.Min()<<endl;//1    s.Pop();    cout<<s.Min()<<endl;//1    s.Pop();    cout<<s.Min()<<endl;//2    s.Pop();    cout<<s.Min()<<endl;//2    s.Pop();    cout<<s.Min()<<endl;//6    //s.Pop();    //cout<<s.Min()<<endl;    return 0;}
阅读全文
0 0
原创粉丝点击