使用两个栈实现一个队列

来源:互联网 发布:跑跑卡丁车淘宝买号 编辑:程序博客网 时间:2024/05/19 06:19

栈是后进先出,而队列是先进先出,所以可以采用如下方法
这里写图片描述
在s1中压入数据之后再将s1中数据挨个弹出压入s2中,此时s2栈中数据的出栈顺序即为队列的头出的顺序
代码如下

class Solution{public:    void Push(int data)    {        stack1.push(data);    }    void Pop()    {        assert(!stack1.empty() || !stack2.empty());        if (stack2.empty())        {            while (!stack1.empty())            {                stack2.push(stack1.top());                stack1.pop();            }        }        stack2.pop();    }    int& Front()    {        assert(!stack1.empty() || !stack2.empty());        if (!stack2.empty())        {            return stack2.top();        }        while (!stack1.empty())        {            stack2.push(stack1.top());            stack1.pop();        }        return stack2.top();    }    int& Back()    {        assert(!stack1.empty() || !stack2.empty());        while (!stack1.empty())        {            return stack1.top();        }        if (!stack2.empty())        {            stack1.push(stack2.top());            stack2.pop;        }        return stack1.top();    }private:    stack<int> stack1;    stack<int> stack2;};

注意再向s2中压入数据的时候s2栈必须为空,且s1中的数据必须一次全部压入s2 中,出栈的顺序才能和队列一样

两个队列实现一个栈
也可以用两个队列来实现一个栈
将q1中的数据个数大于1的时候将它们挨个头出然后压入q2队列中,然后q1中的数据就是栈顶,将它pop出去之后在交换q1 q2中的数据 然后重复上述操作,最后就是 出栈的结果
这里写图片描述
代码如下

{    void Push(int data)    {        Data.push(data);    }    void pop()    {        assert(!Data.empty());        while (Data.size() > 1)        {            Help.push(Data.front());            Data.pop();        }        Data.pop();        std::swap(Data, Help);    }    int& top()    {        assert(!Data.empty());        return Data.back();    }private:    queue<int>Data;    queue<int>Help;};
0 0