问题:

进栈到出栈的数据元素的转移在出栈(stack_out)为空的时候发生。

用栈实现队列:

 

 1 #include <iostream>
 2 #include "LinkStack.h"
 3 #include "LinkQueue.h"
 4 
 5 using namespace std;
 6 using namespace DTLib;
 7 
 8 template < typename T >
 9 class StackToQueue : public Queue<T>
10 {
11 protected:
12     mutable LinkStack<T> m_stack_in;
13     mutable LinkStack<T> m_stack_out;
14 
15     void move() const
16     {
17         if( m_stack_out.size() == 0 )
18         {
19             while( m_stack_in.size() > 0 )
20             {
21                 m_stack_out.push(m_stack_in.top());
22                 m_stack_in.pop();
23             }
24         }
25     }
26 
27 public:
28     void add(const T& e)   // O(1)
29     {
30         m_stack_in.push(e);
31     }
32 
33     void remove()   // O(n)
34     {
35         move();
36 
37         if( m_stack_out.size() > 0 )
38         {
39             m_stack_out.pop();
40         }
41         else
42         {
43             THROW_EXCEPTION(InvalidOperationException, "No element in current queue ...");
44         }
45     }
46 
47     T front() const  // O(n)
48     {
49         move();
50 
51         if( m_stack_out.size() > 0 )
52         {
53             return m_stack_out.top();
54         }
55         else
56         {
57             THROW_EXCEPTION(InvalidOperationException, "No element in current queue ...");
58         }
59     }
60 
61     void clear()  // O(n)
62     {
63         m_stack_in.clear();
64         m_stack_out.clear();
65     }
66 
67     int length() const   // O(1)
68     {
69         return m_stack_in.size() + m_stack_out.size();
70     }
71 };
72 
73 int main()
74 {
75     StackToQueue<int> sq;
76 
77     for(int i = 0; i < 10; i++)
78     {
79         sq.add(i);
80     }
81 
82     while( sq.length() > 0 )
83     {
84         cout << sq.front() << endl;
85         sq.remove();
86     }
87 
88     return 0;
89 }

 

结果如下:

 

用队列实现栈:

 

 

进栈时直接进,出栈时,先将前n-1个元素转移到另一个队列,然后剩下的那一个元素出去即可。

两个队列来回倒换。

程序如下:

 

  1 #include <iostream>
  2 #include "LinkStack.h"
  3 #include "LinkQueue.h"
  4 
  5 using namespace std;
  6 using namespace DTLib;
  7 
  8 template < typename T >
  9 class StackToQueue : public Queue<T>
 10 {
 11 protected:
 12     mutable LinkStack<T> m_stack_in;
 13     mutable LinkStack<T> m_stack_out;
 14 
 15     void move() const
 16     {
 17         if( m_stack_out.size() == 0 )
 18         {
 19             while( m_stack_in.size() > 0 )
 20             {
 21                 m_stack_out.push(m_stack_in.top());
 22                 m_stack_in.pop();
 23             }
 24         }
 25     }
 26 
 27 public:
 28     void add(const T& e)   // O(1)
 29     {
 30         m_stack_in.push(e);
 31     }
 32 
 33     void remove()   // O(n)
 34     {
 35         move();
 36 
 37         if( m_stack_out.size() > 0 )
 38         {
 39             m_stack_out.pop();
 40         }
 41         else
 42         {
 43             THROW_EXCEPTION(InvalidOperationException, "No element in current queue ...");
 44         }
 45     }
 46 
 47     T front() const  // O(n)
 48     {
 49         move();
 50 
 51         if( m_stack_out.size() > 0 )
 52         {
 53             return m_stack_out.top();
 54         }
 55         else
 56         {
 57             THROW_EXCEPTION(InvalidOperationException, "No element in current queue ...");
 58         }
 59     }
 60 
 61     void clear()  // O(n)
 62     {
 63         m_stack_in.clear();
 64         m_stack_out.clear();
 65     }
 66 
 67     int length() const   // O(1)
 68     {
 69         return m_stack_in.size() + m_stack_out.size();
 70     }
 71 };
 72 
 73 template < typename T >
 74 class QueueToStack : public Stack<T>
 75 {
 76 protected:
 77     LinkQueue<T> m_queue_1;
 78     LinkQueue<T> m_queue_2;
 79 
 80     LinkQueue<T>* m_pIn;
 81     LinkQueue<T>* m_pOut;
 82 
 83     void move() const  // O(n)
 84     {
 85         int n = m_pIn->length() - 1;
 86 
 87         for(int i = 0; i < n; i++)
 88         {
 89             m_pOut->add(m_pIn->front());
 90 
 91             m_pIn->remove();
 92         }
 93     }
 94 
 95     void swap()  // O(1)
 96     {
 97         LinkQueue<T>* temp = NULL;
 98 
 99         temp = m_pIn;
100         m_pIn = m_pOut;
101         m_pOut = temp;
102     }
103 
104 public:
105     QueueToStack()   // O(1)
106     {
107         m_pIn = &m_queue_1;
108         m_pOut = &m_queue_2;
109     }
110 
111     void push(const T& e)   // O(1)
112     {
113         m_pIn->add(e);
114     }
115 
116     void pop()  // O(n)
117     {
118         if( m_pIn->length() > 0 )
119         {
120             move();
121 
122             m_pIn->remove(); //出栈
123 
124             swap();
125         }
126         else
127         {
128             THROW_EXCEPTION(InvalidOperationException, "No element in current stack...");
129         }
130     }
131 
132     T top() const  //  O(n)
133     {
134         if( m_pIn->length() > 0 )
135         {
136             move();
137 
138             return m_pIn->front();
139         }
140         else
141         {
142             THROW_EXCEPTION(InvalidOperationException, "No element in current stack...");
143         }
144     }
145 
146     void clear()  // O(n)
147     {
148         m_queue_1.clear();
149         m_queue_2.clear();
150     }
151     int size() const   // O(1)
152     {
153         return m_queue_1.length() + m_queue_2.length();
154     }
155 };
156 
157 int main()
158 {
159     QueueToStack<int> qs;
160 
161     for(int i = 0; i < 10; i++)
162     {
163         qs.push(i);
164     }
165 
166     while( qs.size() > 0 )
167     {
168         cout << qs.top() << endl;
169         qs.pop();
170     }
171 
172     return 0;
173 }

 

结果如下:

 

 

 

 小结:

 

posted on 2018-09-16 22:21  周伯通789  阅读(212)  评论(0编辑  收藏  举报