我们通过一系列栈的压入和弹出操作来分析用两个队列模拟一个栈的过程。如图(a)所示,我们先往栈内压入一个元素A。由于两个队列现在都是空的,我们可以选择把A插入两个队列的任意一个。不妨插入queue1。接下来继续往栈内压入B、C两个元素,我们把它们都插入queue1。这个时候queue1包含3个元素A、B和C,其中A位于队列的头部,C位于队列的尾部。
现在我们考虑从栈内弹出一个元素。根据栈的后入先出原则,最后被压入栈的C应该最先被弹出。由于C位于queue1的尾部,而我们每次只能从队列的头部删除元素,因此我们可以先从queue1中依次删除元素A、B并插入到queue2中,再从queue1中删除元素C。这就相当于从栈中弹出元素C了(如图(b)所示)。我们可以用同样的方法从栈内弹出元素B(如图©所示)
接下来我们考虑往栈内压入一个元素D。此时queue1已经有一个元素,我们就把D插入到queue1的尾部(如图(d)所示)。如果我们再从栈内弹出一个元素,此时被弹出的应该是最后被压入的D。由于D位于queue1的尾部,我们只能先从有删除queue1的元素并插入到queue2,直到在queue1中遇到D再直接把它删除(如图(e)所示)。
注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。
完整代码
#include <iostream>
#include <stdlib.h>
#include <stack>
#include <queue>
using namespace std;
template <typename T> class CStack
{
public:
CStack(void){
};
~CStack(void){