队列的特点是先入先出,栈的特点是先入后出
思路:
假设入栈元素为:a->b>c,则出栈顺序为c->b->a
入栈
将元素a,b,c入栈,选择任意一个队列。入队列q1,此时q2是为空
出栈
1)将c出栈,先将a出队列q1,入队列q2。再将b出队列q1,入队列q2。此时q1中只有c,q2中有a,b。将c出队列删除,即出栈了
如果此时有元素d入栈了,则将d入非空队列q2。下次出栈便会先出栈了。
2)将b出栈,先将a出队列q2,入队列q1,此时q2中剩下b,q1中剩下a。将b出队列删除即将b出栈了。
如果此时有元素d入栈了,则将d入非空队列q1。下次出栈便会先出栈了。
3)将a出栈,直接将a出队列q1删除即可。
总结:
入栈,需要判断队列是否为空,先压入非空队列
出栈,需要判断其中一个队列是否为空,对非空队列进行出队列,对空队列进行入队列,直到非空队列就剩下一个元素,弹出,便是需要出栈的元素
实现代码如下:
template<typename T>class CStack
{
public:
CStack(void);
~CStack(void);
void appendTail(const T& node);
T deleteHead();
private:
queue<T> q1;
queue<T> q2;
}
template<typename T> void CStack<T>::appendTail(const T& element)
{
if(!q1.empty())
{
ql.push(element);
}
else
{
q2.push(element);
}
}
template<typename T>T CStack<T>::deleteHead()
{
if(q1.empty())
{
while(q2.size()>1)
{
T& data=q2.front();
q1.push(data);
q2.pop();
}
head=q2.front();
q2.pop();
}
else
{
while(q1.size()>1)
{
T& data=q1.front();
q2.push(data);
q1.pop();
}
head=q1.front();
q1.pop();
}
return head;
}