careercup-栈与队列 3.2

3.2 请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值。push、pop和min三个方法的时间复杂度必须为O(1)。

我们假设除了用一个栈s1来保存数据,还用另一个栈s2来保存这些非冗余最小值。那么, 当我们将数据压到要s1时,同时将它和s2的栈顶元素比较,如果不大于s2的栈顶元素, 那么将当前值也压入s2中。这样一来,s2中保存的就是一个阶段性最小值。 即s2中的每个值都是s1中栈底到达某个位置的最小值。那么,如果执行pop操作呢? 执行pop操作除了将s1中的栈顶元素出栈,还要将它和s2中的栈顶元素比较,如果相等, 说明这个值是栈底到栈顶的最小值,而它出栈后,最小值就不再是它了。所以, s2也要将栈顶元素出栈,新的栈顶元素将对应s1剩下元素中新的最小值。

 

C++实现代码:

#include<iostream>

#include<stack>

using namespace std;



class MinStack

{

private:

    stack<int> stack1;

    stack<int> stack2;

public:

    void push(int x)

    {

        if(stack1.empty())

        {

            stack1.push(x);

            stack2.push(x);

        }

        if(stack1.top()<x)

            stack2.push(x);

        else

        {

            stack1.push(x);

            stack2.push(x);

        }

    }

    void pop()

    {

        if(stack1.empty())

            stack2.pop();

        if(stack1.top()==stack2.top())

        {

            stack1.pop();

            stack2.pop();

        }

        else

            stack2.pop();

    }

    int top()

    {

        if(stack2.empty())

            return 0;

        else

            return stack2.top();

    }

    int getMin()

    {

        if(stack1.empty())

            return 0;

        else

            return stack1.empty();

    }

};



int main()

{

    MinStack mystack;//StackWithMin mystack;

    for(int i=0; i<20; ++i)

        mystack.push(i);

    cout<<mystack.getMin()<<" "<<mystack.top()<<endl;

    mystack.push(-100);

    mystack.push(-100);

    cout<<mystack.getMin()<<" "<<mystack.top()<<endl;

    mystack.pop();

    cout<<mystack.getMin()<<" "<<mystack.top()<<endl;

    return 0;

}

 

你可能感兴趣的:(UP)