两个栈实现队列
利用两个栈实现队列,算法导论练习10.1-6
enQueue操作很简单,直接利用栈的push操作即可;与栈不同,deQueue操作需要将队列头部的元素删除,此时需要利用第二个栈。
要想得到队列的头部元素,就要设法把队列头部的元素设法放到栈顶。当进行deQueue操作时,将存在第一个栈中的所有元素相继弹出,压入第二个栈,这样,原来头部的元素就处在了第二个栈的栈顶,此时pop即可。
此时不需要将第二个栈中的元素都弹出再压入第一个栈。可以这样看:将两个栈的栈底连接起来,第二个栈栈顶作为队列头,第一个栈栈顶作为队列尾,相当于两个栈连接起来构成了一个队列。
#include "stack.h"
#include <iostream>
using namespace std;
template<typename T> class QueueUseStack
{
public:
Stack<T> s1,s2;
bool isEmpty()
{
if(s1.size() == 0 && s2.size() == 0)
return true;
else
return false;
}
int size()
{
return s1.size()+s2.size();
}
void enQueue(T x)
{
s1.push(x);
}
T deQueue()
{
if(!isEmpty())
{
while(s1.size()>0)
{
T temp = s1.pop();
s2.push(temp);
}
T r = s2.pop();
return r;
}
else
{
cout<<"Queue underflow!"<<endl;
return NULL;
}
}
T getHead()
{
if(s2.isEmpty())
{
s1.arr[0];
}
else
{
s2.arr[s2.size()-1];
}
}
T getTail()
{
if(s2.isEmpty())
{
s1.getTop
}
else
{
s2.arr[0];
}
}
void show()
{
if(isEmpty())
cout<<"Queue is empty!"<<endl;
else
{
for(int i=s2.size()-1;i>=0;i--)
{
cout<<s2.arr[i]<<" ";
}
s1.show();
}
}
QueueUseStack()
{
}
~QueueUseStack()
{
}
};
int main(void)
{
QueueUseStack<char> q1;
for(int i=0;i<20;i++)
q1.enQueue('a'+i);
q1.show();
for(int i=0;i<10;i++)
cout<<q1.deQueue()<<endl;
q1.show();
return 0;
}