1 // 栈变队列变栈.cpp : 定义控制台应用程序的入口点。
2 //
3
4 /****************************************************
5
6 设计者:cslave
7 版本说明:本代码免费用于商用,拷贝,转移,使用,但是
8 有本代码导致的问题,本人概不负责。
9 设计时间:2012.6.25
10 分发原则:遵守GNU规范。
11
12 题目:使用两个队列来实现栈,或者使用两个栈来实现队列。
13
14 首先讲讲两个栈来实现队列,这个比较简单,队列先进先出,
15 栈后进先出,先在一个栈A尾部添加元素,需要删除的时候
16 将一个栈A元素全部出队列放入另一个栈B,然后再有添加
17 元素的话放在本栈A,有删除就从栈B中出,当B为空时,直到
18 B为空,再将A中元素给B。如此翻转。
19
20
21 在讲讲两个队列实现栈,先在一个空队列 A push元素,需要pop的
22 时候,将A的元素入队列B,直到A中有一个元素,即为该元素,然后
23 pop掉,再次push的话,放入队列B中,一次类推。
24
25 *****************************************************/
26
27
28
29 #include "stdafx.h"
30 #include <stack>
31 #include <queue>
32 #include <iostream>
33 using namespace std;
34
35 template<typename T>
36 class CQueue //队列模板
37 {
38 public:
39 CQueue(void);
40 ~CQueue(void);
41 void AppendTail(const T& node);//队列的尾部加入函数
42 T DeleteHead();
43 private:
44 stack<T> stack1;
45 stack<T> stack2;
46 };
47
48
49
50 template<typename T>
51 CQueue<T>::CQueue()
52 {
53
54 }
55
56 template<typename T>
57 CQueue<T>::~CQueue()
58 {
59
60 }
61
62 template<typename T>
63 void CQueue<T>::AppendTail(const T& node) //队列尾部添加函数
64 {
65 stack1.push(node);
66 }
67
68 template<typename T>
69 T CQueue<T>::DeleteHead()
70 {
71 if(stack2.size()<=0) // 栈2 队列当有出元素操作时,若栈2为空 则栈1元素入栈2,然后从栈2出队列
72 {
73 while(stack1.size()>0)
74 {
75 T& Data=stack1.top();
76 stack1.pop();
77 stack2.push(Data);
78 }
79 }
80 if(stack2.size()<=0)
81 throw new exception("queue is empty!");
82 T Head=stack2.top();
83 stack2.pop();
84 return Head;
85 }
86
87
88
89 template<typename T>
90 class CStack
91 {
92 public:
93 CStack();
94 ~CStack();
95 void PushBack(const T& node);
96 T Top();
97 T Pop();
98 private:
99 queue<T> queue1;
100 queue<T> queue2;
101 };
102
103 template<typename T>
104 CStack<T>::CStack()
105 {
106
107 }
108
109 template<typename T>
110 CStack<T>::~CStack()
111 {
112
113 }
114
115 template<typename T>
116 void CStack<T>::PushBack(const T& node) //栈的PUSH函数,因为每次出栈都可能导致两队列间元素转移,所以要判断
117 {
118 if(!queue1.empty())
119 {
120 queue1.push(node);
121 }
122 else if(!queue1.empty())
123 {
124 queue2.push(node);
125 }
126 else
127 {
128 queue1.push(node);
129 }
130 }
131
132 template<typename T>
133 T CStack<T>::Top()//这个函数有点投机取巧了,不能算。
134 {
135 if(!queue1.empty())
136 return queue1.back();
137 else if(!queue2.empty())
138 return queue2.back();
139 else
140 throw new exception("Invalid Stack");
141 }
142
143 template<typename T>
144 T CStack<T>::Pop() //出栈操作,比较麻烦,o(n)复杂度
145 {
146 T node;
147 if(!queue1.empty())
148 {
149 while(queue1.size()!=1)
150 {
151 node=queue1.front();
152 queue2.push(node);
153 queue1.pop();
154 }
155 node=queue1.front();
156 queue1.pop();
157 return node;
158 }
159 else if(!queue2.empty())
160 {
161 while(queue2.size()!=1)
162 {
163 node=queue2.front();
164 queue1.push(node);
165 queue2.pop();
166 }
167 node=queue2.front();
168 queue1.pop();
169 return node;
170 }
171 else
172 throw new exception("Invalid Stack!");
173 }
174
175
176 void Test(char actual, char expected)
177 {
178 if(actual == expected)
179 printf("Test passed.\n");
180 else
181 printf("Test failed.\n");
182 }
183
184 void TestStack(char actual,char expected)
185 {
186 if(actual==expected)
187 printf("Test passed.\n");
188 else
189 printf("Test failed.\n");
190 }
191
192
193
194 int _tmain(int argc, _TCHAR* argv[])
195 {
196
197 cout<<"队列测试开始!"<<endl;
198 CQueue<char> queue;
199 queue.AppendTail('a');
200 queue.AppendTail('b');
201 queue.AppendTail('c');
202
203 char head = queue.DeleteHead();
204 Test(head, 'a');
205
206 head = queue.DeleteHead();
207 Test(head, 'b');
208
209 queue.AppendTail('d');
210 head = queue.DeleteHead();
211 Test(head, 'c');
212
213 queue.AppendTail('e');
214 head = queue.DeleteHead();
215 Test(head, 'd');
216
217 head = queue.DeleteHead();
218 Test(head, 'e');
219
220 cout<<"栈测试开始!"<<endl;
221 CStack<char> stack;
222 stack.PushBack('a');
223 stack.PushBack('b');
224 stack.PushBack('c');
225 char front=stack.Top();
226 TestStack(front,'c');
227 stack.Pop();
228 front=stack.Top();
229 TestStack(front,'b');
230 stack.Pop();
231 stack.PushBack('d');
232 front=stack.Top();
233 TestStack(front,'d');
234 stack.Pop();
235 stack.PushBack('e');
236 front=stack.Top();
237 TestStack(front,'e');
238 stack.Pop();
239 return 0;
240 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步