一、实现思路
首先,让我们来回顾一下栈和队列的相关知识。栈是一种后进先出的线性数据结构,它只允许从栈顶插入和删除数据;队列是一种先进先出的线性数据结构,一般意义上的队列允许从一端插入数据,从另一端删除数据,插入数据的一端称为队尾(rear),取出数据的一端称为队头(front)。
然后,我们很自然的可以想到用两个栈来实现,思路如下:
(1)定义两个空栈s1和s2,假设有5个数1、2、3、4和5,如果按顺序入队,那么一定按顺序出队。
(2)将这5个数按顺序压入栈s1,此时s1中栈顶元素为5,我们可以考虑将栈顶元素弹出并压入s2中,依次循环5次以后,s2中的栈顶元素变为1,此时再将s2中的栈顶元素依次弹出,出栈的顺序就是1、2、3、4、5。
这样,我们就用两个栈来实现了一个简单的队列。
二、实现过程
/*
程序说明:该程序使用两个栈来模拟实现队列
程序来源:剑指Offer
*/
template<typename T>
void CQueue<T>::appendTail(const T& element)
{
stack1.push(element);
}
template<typename T>
T CQueue<T>::deleteHead()
{
if(stack2.size() <= 0)
{
while(stack1.size() > 0)
{
T& data = stack1.top();
stack1.pop();
stack2.push(data);
}
}
if(stack2.size() == 0)
{
throw new exception("queue is empty");
}
T head = stack2.top();
stack2.pop();
return head;
}
/*
代码来源:C/C++程序员面试笔记
*/
#