两个队列实现一个栈,要求实现Push以及Pop等方法

问题描述:用两个队列实现一个栈,要求实现Push以及Pop等方法。
分析问题:这个问题类似于两个栈实现一个队列,现有两个队列q1、q2,第一种思路是入栈时,将元素压入q1;出栈时将q1中的元素除队尾的一个以外其他顺次压入q2中,将q1队尾元素弹出。再将q2压回q1。
这里写图片描述

另外一种思路是在上述基础上:
入栈时,直接压入q1;
出栈时,如果q1不为空,q1.size()等于1,直接弹出,即q1.pop(),q1.size()大于1,先将q1除队尾元素逐个压入q2,再弹出q1队尾元素;如果q1为空q2不为空,当q2.size()等于1时,直接弹出,q2.size()大于1,先将q2除队尾元素逐个压入q1,在弹出q2队尾元素。
与第一种思路相比,这里不用每次都将q2压回q1。

代码实现:

#include<iostream>
#include<queue>
using namespace std;
typedef int T;

class DoubleQueue_Stack
{
public:
    DoubleQueue_Stack()
    {}
    ~DoubleQueue_Stack()
    {}
    void Push(T x)
    {
        q1.push(x);
    }
    void Pop()
    {
        if (!q1.empty())
        {
            //将q1除最后一个元素逐个倒入q2
            while (q1.size() > 1)
            {
                q2.push(q1.front());
                q1.pop();
            }
            q1.pop();
        }
        else if (!q2.empty())
        {
            while (q2.size() > 1)
            {
                q1.push(q2.front());
                q2.pop();
            }
            q2.pop();
        }
        else
        {
            cout << "empty" << endl;
        }
    }
    bool Empty()
    {
        if (q1.empty() && q2.empty())
        {
            return true;
        }
        return false;
    }
    T& Top()
    {
        if (!q1.empty())
        {
            return q1.back();
        }
        if (!q2.empty())
        {
            return q2.back();
        }
    }
    void Print()
    {
        while (!Empty())
        {
            cout << Top() << ' ';
            Pop();
        }
    }
private:
    queue<T> q1;
    queue<T> q2;
};

void Test()
{
    DoubleQueue_Stack ds;
    ds.Push(1);
    ds.Push(2);
    ds.Push(3);
    ds.Push(4);
    ds.Push(5);
    ds.Push(6);
    ds.Print();
}
int main()
{
    Test();
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值