参考:http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html
1.方法1(基本方法)
这个时候把s2当做是一个缓冲栈。
入队:将数据压入栈s1.
出队:将栈s1中的数据弹出,再压入栈s2中,出栈的时候,弹出s2栈顶的数据。接下来,再将s2数据倒入s1中。(所以每次出栈完后,s2都是空的,因为s2只是缓冲栈)
如下图:
2.方法2 (变种1)---此方法其实就是每次出队后,不是马上让s2数据倒入s1.适用于出队比较频繁的操作。
入队 :先判断s1是否为空,如不为空,说明所有元素都在s1,此时将入队元素直接压入s1;如为空,要将s2的元素逐个“倒回”s1,再压入入队元素。
出队: 先判断s2是否为空,如不为空,直接弹出s2的顶元素并出队;如为空,将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
3.方法3(最优法)
入队: 将数据压入栈s1
出队:如果(写代码的时候用if)s2不为空,此时是先进来的数据,所以直接出栈,若s2为空(写代码的时候用if),将s1数据压入s2中,再弹出栈顶数据。
核心代码如下:
template <typename T> class CQueue { public: CQueue(); ~CQueue(); void Enqueue(const T & element); T Dequeue(); };
template <typename T> void Enqueue(const T & element) { stack1.push(element); } template <typename T> //每次定义一个模板类 都要重复写一遍 T CQueue<T>::Dequeue() //类模板外定义成员函数,<T>不能少。 { T element; //当s2为空的时候,将s1倒入s2 if (stack2.size()==0) { while(stack1.size()>0) { element=stack1.top(); stack1.pop(); stack2.push(element); } } if (stack2.size()==0) throw new exception("queue is empty!"); //当s2 不为空的时候,直接将s2栈顶元素出栈 element=stack2.top(); stack2.pop(); return element; }