两个栈实现一个队列

参考: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;

}

你可能感兴趣的:(队列)