如何用两个队列实现一个栈

  • 把队列A的元素依次出队,再送入另一个空的队列B后,队列B中元素顺序和原队列A完全一致,这个过程中我们可以灵活地控制入队元素的个数,比如从A中出队10个,只向B中放入前9个,就相当于将队列A的队尾元素出队,其他元素原样搬运到队列B中。试想,一个队列除了支持从队尾插入元素外,还支持从队尾弹出元素,那么它不就已经具备了栈的功能了嘛。

    此题来自《算法导论》习题10.1-7,为了让代码更加简明扼要,就让队列的元素类型是int吧。
    头文件“Queue.h”定义了class Queue,具体实现见博文 https://www.cnblogs.com/meixiaogua/p/9670744.html

#include "Queue.h"
class StackByQueues
{
public:
    StackByQueues(int len);
    ~StackByQueues();

    void Push(int val);
    void Pop();
    int  Top() const;

    bool IsEmpty() const;
private:
    Queue* m_queue[2];
    bool   m_current;//index of currently active queue
};

StackByQueues::StackByQueues(int len)
{
    m_queue[0] = new Queue(len);
    m_queue[1] = new Queue(len);
    m_current = 0;
}

StackByQueues::~StackByQueues()
{
    delete m_queue[0];
    delete m_queue[1];
}

void StackByQueues::Push(int val)
{
    m_queue[m_current]->Enqueue(val);
}

void StackByQueues::Pop()
{
    if(m_queue[m_current]->IsEmpty())
    {
        cout << "Underflow" << endl;
        return;
    }
    //把前面所有元素从一个队列搬运到另一个队列,舍弃掉最后一个出队的元素
    int front = m_queue[m_current]->Front();
    m_queue[m_current]->Dequeue();
    while(!IsEmpty())
    {
        m_queue[!m_current]->Enqueue(front);
        front = m_queue[m_current]->Front();
        m_queue[m_current]->Dequeue();
    }
    m_current = ! m_current; //同时切换持有数据的队列的下标
}

int StackByQueues::Top() const
{
    return m_queue[m_current]->Back();
}

bool StackByQueues::IsEmpty() const
{
    return m_queue[m_current]->IsEmpty();
}

转载于:https://www.cnblogs.com/meixiaogua/p/9676140.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值