使用兩個隊列來模擬實現一個棧的功能
因爲隊列的特性是先入先出,棧的特性是後入先出,所以相當於是把一開始入到隊列裏面的數據先出出去,直到剩下最後一個數據,也就是本來棧中應該彈出的最後一個進入的數據,所以兩個隊列,就來回倒,就好了,每次都出隊列中最後一個數據就好;
因爲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;
};