问题描述:用两个队列实现一个栈,要求实现Push以及Pop等方法。
分析问题:这个问题类似于两个栈实现一个队列,现有两个队列q1、q2,第一种思路是入栈时,将元素压入q1;出栈时将q1中的元素除队尾的一个以外其他顺次压入q2中,将q1队尾元素弹出。再将q2压回q1。
另外一种思路是在上述基础上:
入栈时,直接压入q1;
出栈时,如果q1不为空,q1.size()等于1,直接弹出,即q1.pop(),q1.size()大于1,先将q1除队尾元素逐个压入q2,再弹出q1队尾元素;如果q1为空q2不为空,当q2.size()等于1时,直接弹出,q2.size()大于1,先将q2除队尾元素逐个压入q1,在弹出q2队尾元素。
与第一种思路相比,这里不用每次都将q2压回q1。
代码实现:
#include<iostream>
#include<queue>
using namespace std;
typedef int T;
class DoubleQueue_Stack
{
public:
DoubleQueue_Stack()
{}
~DoubleQueue_Stack()
{}
void Push(T x)
{
q1.push(x);
}
void Pop()
{
if (!q1.empty())
{
//将q1除最后一个元素逐个倒入q2
while (q1.size() > 1)
{
q2.push(q1.front());
q1.pop();
}
q1.pop();
}
else if (!q2.empty())
{
while (q2.size() > 1)
{
q1.push(q2.front());
q2.pop();
}
q2.pop();
}
else
{
cout << "empty" << endl;
}
}
bool Empty()
{
if (q1.empty() && q2.empty())
{
return true;
}
return false;
}
T& Top()
{
if (!q1.empty())
{
return q1.back();
}
if (!q2.empty())
{
return q2.back();
}
}
void Print()
{
while (!Empty())
{
cout << Top() << ' ';
Pop();
}
}
private:
queue<T> q1;
queue<T> q2;
};
void Test()
{
DoubleQueue_Stack ds;
ds.Push(1);
ds.Push(2);
ds.Push(3);
ds.Push(4);
ds.Push(5);
ds.Push(6);
ds.Print();
}
int main()
{
Test();
system("pause");
return 0;
}