我们都知道,栈的顺序是现金后出,而队列的顺序是后进先出,用两个栈实现一个队列,算法的思路如下:
现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;现在要出栈,后进先出那么4要出栈。但是q1是一个
队列,先进先出,那么 1 2 3出队列 q2 1 2 3 入队列,q1中此时剩余4,把4出对列达到出栈的效果。 这个时候如果我们又加入一个元素5,那么我们应该把5放到
q1还是q2,因为现在q2中有 1 2 3,把5放到q1不方便统计,所以要把5放入到q2;如果5放到了q1,等下编写出栈的代码很麻烦,如果放到q2我们只需要分类:q2
是不是为空,为空的为一种情况,不为空的为一种情况:
所以最后:
如果q1与q2都为空,那么往q1中插入元素
如果q1不为空,那么往q1中插入元素
如果q2不为空,那么往q1中插入元素
代码实现:
#include<iostream>
using namespace std;
#include<assert.h>
#include<stack>
template<typename T>
class Queue
{
public:
void Push(const T& x)
{
sin.push(x);
}
void Pop()
{
assert(!sin.empty() || sout.empty());
if (sout.empty())//如果出栈的数字为空
{
while (!sin.empty())//当入栈的数字不为空的时候
{
sout.push(sin.top());//入栈里面的最上面数字拿出来放到出栈里面
sin.pop();//入栈最上面的数字pop掉
}
}
sout.pop();//当出栈的数字不为空时,将出栈里面的数字进行pop
}
const T& Front()
{
assert(!sin.empty() || !sout.empty());
if (sout.empty())
{
while (!sin.empty())
{
sout.push(sin.top());
sin.pop();
}
}return sout.top();
}
protected:
stack<T> sin;//定义入栈
stack<T> sout;//定义出栈
};
int main()
{
system("pause");
return 0;
}