队列的操作主要有:入队,出队,返回队列长度,返回队首元素,判断队列是否为空。

   若用两个栈来实现,可以另其中一个栈inStack专门处理入队工作,另一个栈outStack专门处理出队工作。对于入队而言,可以直接把元素加入到inStack中,复杂度为O(1);而对于出队需要做些处理,因为队列是先入先出的,而栈是先入后出,所以输出应该反序。比如inStack接收到的元素顺序为1, 2, 3,栈顶元素是3,但出队希望让1先出。解决方法是把inStack里的元素放到outStack中,这样outStack接收到的元素顺序就是3, 2, 1了,栈顶元素就是我们想要的1,时间复杂度为O(N)。更具体地,入队直接inStack.push(元素),出队先判断outStack是否为空,若 不为空,则直接outStack.pop(),若为空,则把inStack元素导入到outStack里,再执行outStack.pop()。

   代码实现如下所示:

 

#include <stack>
#include <string>
#include <iostream>
#include <cassert>

using namespace std;

template <class T>
class YL_Queue
{
public:
       void enqueue(const T &element); //入队
       T dequeue();   //出队
       T top();   //队首元素
       bool empty() const;  //判断队列是否为空
       size_t size() const;  //队列的尺寸大小


private:
        stack<T> inStack;
        stack<T> outStack;
};

template <class T>
void YL_Queue<T>::enqueue(const T &element)
{
    inStack.push(element);
}


template <class T>
T YL_Queue<T>::dequeue()
{
    assert(!empty());

    T temp;
    if (!outStack.empty())
    {
        temp=outStack.top();
        outStack.pop();
        return temp;
    }
    else
    {
        while(!inStack.empty())
        {
            temp=inStack.top();
            inStack.pop();
            outStack.push(temp);
        }
        temp= outStack.top();
        outStack.pop();
        return temp;
    }
}

template <class T>
T YL_Queue<T>::top()
{
    assert(!empty());

    T temp;
    if (!outStack.empty())
    {
        temp=outStack.top();
        return temp;
    }
    else
    {
        while(!inStack.empty())
        {
            temp=inStack.top();
            inStack.pop();
            outStack.push(temp);
        }
        temp= outStack.top();
        return temp;
    }

}


template <class T>
bool YL_Queue<T>::empty() const
{
    return (size()==0);
}

template <class T>
size_t YL_Queue<T>::size() const
{
    return inStack.size()+outStack.size();
}


void main()
{
    YL_Queue<int> myqueue;
    myqueue.enqueue(1);
    myqueue.enqueue(2);
    myqueue.enqueue(3);
    myqueue.enqueue(4);
    myqueue.enqueue(5);
    cout<<"1队列的大小为: "<<myqueue.size()<<endl;
    cout<<"1队首的元素为: "<<myqueue.top()<<endl;
    myqueue.dequeue();
    myqueue.dequeue();
    cout<<"2队列的大小为: "<<myqueue.size()<<endl;
    cout<<"2队首的元素为: "<<myqueue.top()<<endl;
    myqueue.dequeue();
    myqueue.dequeue();
    myqueue.dequeue();
    cout<<"3队列的大小为: "<<myqueue.size()<<endl;
}