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