使用两个队列来模拟实现一个栈的功能
因为队列的特性是先入先出,栈的特性是后入先出,所以相当于是把一开始入到队列里面的数据先出出去,直到剩下最后一个数据,也就是本来栈中应该弹出的最后一个进入的数据,所以两个队列,就来回倒,就好了,每次都出队列中最后一个数据就好;
因为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;
};