两个队列实现栈

用两个队列实现栈,算法导论10.1-7

push操作很简单,利用队列的enQueue即可;pop操作要设法将栈顶的元素放置到队列头部,再利用deQueue操作。

当进行pop操作时,对当前存储栈元素的队列q1的元素相继进行deQueue操作,再enQueue入另一个空队列q2,直到q1中只剩余一个元素,此时对其进行deQueue操作,即实现了pop。再将两个队列交换名称即可。

#include "queue.h"
#include <iostream>
using namespace std;

template<typename T> class StackUseQueue
{
public:
Queue<T> qa,qb;
Queue<T> *q1;
Queue<T> *q2;

bool isEmpty()
{
if(q1->size() == 0 && q2->size() == 0)
return true;
else
return false;
}
int size()
{
return q1->size()+q2->size();
}
void push(T x)
{
q1->enQueue(x);
}
T pop()
{
if(!isEmpty())
{
while(q1->size()>1)
{
T temp = q1->deQueue();
q2->enQueue(temp);
}
T r = q1->deQueue();
Queue<T> *q;
q = q1;
q1 = q2;
q2 = q;
return r;
}
else
{
cout<<"Stack underflow!"<<endl;
return NULL;
}
}
T getTop()
{
if(!isEmpty())
{
return q1->getTail();
}
else
{
cout<<"Stack is empty!"<<endl;
return NULL;
}
}
void show()
{
if(isEmpty())
cout<<"Stack is empty!"<<endl;
else
{
q1->show();
}
}
StackUseQueue()
{
q1 = &qa;
q2 = &qb;
}
~StackUseQueue()
{
}
};

int main(void)
{
StackUseQueue<char> s1;
for(int i=0;i<20;i++)
s1.push('a'+i);
s1.show();
for(int i=0;i<10;i++)
cout<<s1.pop()<<endl;
s1.show();
return 0;
}

posted @ 2013-06-08 15:47  肖恩吃青草  阅读(97)  评论(0编辑  收藏  举报