队列的操作主要有:入队,出队,返回队列长度,返回队首元素,判断队列是否为空。
若用两个栈来实现,可以另其中一个栈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; }