栈的操作主要有:入栈,出栈,返回栈顶元素,返回栈长度以及判断栈是否为空。

  若用两个queue实现(可以定义成queue的数组queue q[2]),可以增加一个currentIndex来指向当前选中的queue。入栈操作可以直接把元素加到queue里,即  queue[currentIndex].push(element),时间复杂度为O(1),出栈操作要复杂一些,还是因为栈和队列元素的出入顺序不 同,处理方法是将size()-1个元素从q[currentIndex]转移到空闲队列q[(currentIndex + 1)%2]中,q[currentIndex]最后一个剩下的元素恰对应栈顶元素,之后更新一下currentIndex即可,时间复杂度为O(N)。

代码实现如下:

 1 #include <iostream>
 2 #include <queue>
 3 #include <cassert>
 4 using namespace std;
 5 
 6 template <class T>
 7 class YL_Stack
 8 {
 9 public:
10         YL_Stack():currentIndex(0)
11         {
12 
13         }
14         void push(const T &element); //入栈
15         void pop();  //出栈
16         T top();  //栈顶元素
17         size_t size() const;  //栈的大小
18         bool empty() const;   //判断栈是否为空
19 
20 
21 private:
22     int currentIndex;
23     queue<T> q[2];
24 };
25 
26 template <class T>
27 void YL_Stack<T>::push(const T &element)
28 {
29     q[currentIndex].push(element);
30 }
31 
32 template <class T>
33 size_t YL_Stack<T>::size() const
34 {
35     return q[0].size()+q[1].size();
36 }
37 
38 template <class T>
39 bool YL_Stack<T>::empty() const
40 {
41     return (size()==0);
42 }
43 
44 template <class T>
45 void YL_Stack<T>::pop()
46 {
47     assert(!empty());
48 
49     int index=(currentIndex+1)%2;
50     while(q[currentIndex].size()>1)
51     {
52         T temp=q[currentIndex].front();
53         q[currentIndex].pop();
54         q[index].push(temp);
55     }
56 
57     q[currentIndex].pop();
58     currentIndex=index;    
59 }
60 
61 template <class T>
62 T YL_Stack<T>::top()
63 {
64     assert(!empty());
65 
66     int index=(currentIndex+1)%2;
67     T temp;
68     while(q[currentIndex].size()>0)
69     {
70         temp=q[currentIndex].front();
71         q[currentIndex].pop();
72         q[index].push(temp);
73     }
74 
75     currentIndex=index;
76     return temp;
77 }
78 
79 
80 void main()
81 {
82     YL_Stack<int> myStack;
83     myStack.push(1);
84     myStack.push(2);
85     myStack.push(3);
86     myStack.push(4);
87     myStack.push(5);
88     cout<<"1栈的大小为:"<<myStack.size()<<endl;
89     cout<<"1栈顶元素为:"<<myStack.top()<<endl;
90     myStack.pop();
91     myStack.pop();
92     myStack.pop();
93     cout<<"2栈的大小为:"<<myStack.size()<<endl;
94     cout<<"2栈顶元素为:"<<myStack.top()<<endl;
95         
96 }