两个队列实现一个栈

使用两个队列来模拟实现一个栈的功能

因为队列的特性是先入先出,栈的特性是后入先出,所以相当于是把一开始入到队列里面的数据先出出去,直到剩下最后一个数据,也就是本来栈中应该弹出的最后一个进入的数据,所以两个队列,就来回倒,就好了,每次都出队列中最后一个数据就好;

剑指offer

因为queue中有一个接口是back,即队列的尾数据,刚好相当于队栈top的数据,所以比较与两个栈实现一个队列中模拟front会简单一些;


#include <iostream>
#include <queue>
#include <assert.h>
using namespace std;

template <class T>
class QStack
{
public:
    void Push(const T& x)
    {
        if ((q1.size() == 0) && (q2.size() == 0))//两个队列都为空
        {
            q1.push(x);
        }
        else if (q1.size() == 0)//否则跟在不为空的队列
        {
            q2.push(x);
        }
        else
        {
            q1.push(x);
        }
    }
    void Pop()
    {
        if ((q1.size() == 0) && (q2.size() == 0))
        {
            cout << "数据为空"<<endl;
            return;
        }
        else if (q1.size() == 0)
        {
            Move(q2, q1);
        }
        else
        {
            Move(q1, q2);
        }
    }

    T& Top() 
    {
        if ((q1.size() == 0) && (q2.size() == 0))
        {
            assert(-1);
        }
        else if (q1.size() == 0)
        {
            return q2.back();
        }
        else
        {
            return q1.back();
        }
    }
    size_t Size()
    {
        return q1.size() + q2.size();
    }
    size_t Empty()
    {
        return q1.empty() && q2.empty();
    }
protected:
    void Move(queue<T>& q,queue<T>& nq)//null_queue
    {
        assert(q.size());
        int size = q.size();
        int tmp = 0;
        while (size > 1)
        {
            tmp = q.front();
            q.pop();
            nq.push(tmp);

            size--;
        }
        q.pop();
    }
protected:
    queue<T> q1;
    queue<T> q2;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值