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

  • 把队列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();
}

posted @ 2018-09-19 18:40  一只美丽的呱呱  阅读(1175)  评论(0编辑  收藏  举报