两个栈实现一个队列

参考:http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html

1.方法1(基本方法)

这个时候把s2当做是一个缓冲栈。

入队:将数据压入栈s1.

出队:将栈s1中的数据弹出,再压入栈s2中,出栈的时候,弹出s2栈顶的数据。接下来,再将s2数据倒入s1中。(所以每次出栈完后,s2都是空的,因为s2只是缓冲栈)

如下图:

image

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;
}
posted @ 2014-06-06 20:26  menghuizuotian  阅读(281)  评论(0)    收藏  举报