c#队列取值_C# 队列
1 Queue2
3 usingSystem;4 usingSystem.Collections.Generic;5 usingSystem.Linq;6 usingSystem.Text;7 usingSystem.Threading;8
9 namespaceDataStructure10 {11 ///
12 ///隊列接口13 ///
14 interface IQueue
15 {16 void EnQueue(T elem); //入隊列操作
17 T DeQueue(); //出隊列操作
18 T GetFront(); //取對頭元素
19 int GetLength(); //求隊列的長度
20 bool IsEmpty(); //判斷隊列是否為空
21 void Clear(); //清空隊列
22 bool IsFull(); //判斷隊列是否為滿
23 }24
25 ///
26 ///銀行隊列接口27 ///
28 interface IBankQueue : IQueue
29 {30 int GetCallnumber(); //獲取服務號碼
31 }32
33
34 ///
35 ///循環順序隊列36 ///
37 ///
38 class CSeqQueue : IQueue
39 {40 private int maxsize; //循環順序隊列的容量
41 private T[] data; //數組,用于存儲循環順序隊列中的數據元素
42 private int front; //指示最近一個已經離開隊列的元素所占有的位置 循環順序隊列的對頭
43 private int rear; //指示最近一個進入隊列的元素的位置 循環順序隊列的隊尾
44
45 public T this[intindex]46 {47 get { returndata[index]; }48 set { data[index] =value; }49 }50
51 //容量屬性
52 public intMaxsize53 {54 get { returnmaxsize; }55 set { maxsize =value; }56 }57
58 //對頭指示器屬性
59 public intFront60 {61 get { returnfront; }62 set { front =value; }63 }64
65 //隊尾指示器屬性
66 public intRear67 {68 get { returnrear; }69 set { rear =value; }70 }71
72 publicCSeqQueue()73 {74
75 }76
77 public CSeqQueue(intsize)78 {79 data = newT[size];80 maxsize =size;81 front = rear = -1;82 }83
84 //判斷循環順序隊列是否為滿
85 public boolIsFull()86 {87 if ((front == -1 && rear == maxsize - 1) || (rear + 1) % maxsize ==front)88 return true;89 else
90 return false;91 }92
93 //清空循環順序列表
94 public voidClear()95 {96 front = rear = -1;97 }98
99 //判斷循環順序隊列是否為空
100 public boolIsEmpty()101 {102 if (front ==rear)103 return true;104 else
105 return false;106 }107
108 //入隊操作
109 public voidEnQueue(T elem)110 {111 if(IsFull())112 {113 Console.WriteLine("Queue is Full !");114 return;115 }116 rear = (rear + 1) %maxsize;117 data[rear] =elem;118 }119
120 //出隊操作
121 publicT DeQueue()122 {123 if(IsEmpty())124 {125 Console.WriteLine("Queue is Empty !");126 return default(T);127 }128 front = (front + 1) %maxsize;129 returndata[front];130 }131
132 //獲取對頭數據元素
133 publicT GetFront()134 {135 if(IsEmpty())136 {137 Console.WriteLine("Queue is Empty !");138 return default(T);139 }140 return data[(front + 1) % maxsize];//front從-1開始
141 }142
143 //求循環順序隊列的長度
144 public intGetLength()145 {146 return (rear - front + maxsize) %maxsize;147 }148 }149
150 ///
151 ///鏈隊列結點類152 ///
153 ///
154 class QueueNode
155 {156 private T data; //數據域
157 private QueueNode next; //引用域
158
159 public QueueNode(T val, QueueNodep)160 {161 data =val;162 next =p;163 }164
165 public QueueNode(QueueNodep)166 {167 next =p;168 }169
170 publicQueueNode(T val)171 {172 data =val;173 next = null;174 }175
176 publicQueueNode()177 {178 data = default(T);179 next = null;180 }181
182 //數據域屬性
183 publicT Data184 {185 get { returndata; }186 set { data =value; }187 }188
189 //引用域屬性
190 public QueueNodeNext191 {192 get { returnnext; }193 set { next =value; }194 }195 }196
197 ///
198 ///鏈隊列類199 ///
200 ///
201 class LinkQueue : IQueue
202 {203 private QueueNode front; //隊列頭指示器
204 private QueueNode rear; //隊列尾指示器
205 private int size; //隊列結點個數206
207 //隊列屬性
208 public QueueNodeFront209 {210 get { returnfront; }211 set { front =value; }212 }213
214 public QueueNodeRear215 {216 get { returnrear; }217 set { rear =value; }218 }219
220 public intSize221 {222 get { returnsize; }223 set { size =value; }224 }225
226 //初始化鏈隊列
227 publicLinkQueue()228 {229 front = rear = null;230 size = 0;231 }232
233 public intGetLength()234 {235 returnsize;236 }237
238 public voidClear()239 {240 front = rear = null;241 size = 0;242 }243
244 public boolIsEmpty()245 {246 if ((front == rear) && (size == 0))247 return true;248 else
249 return false;250
251 }252
253 //鏈隊列沒有容量限制 返回false
254 public boolIsFull()255 {256 return false;257 }258
259 //入隊操作
260 public voidEnQueue(T item)261 {262 QueueNode q = new QueueNode(item);263 if(IsEmpty())264 {265 front =q;266 rear =q;267 }268 else
269 {270 rear.Next =q;271 rear =q;272 }273 ++size;274 }275
276 //出對操作
277 publicT DeQueue()278 {279 if(IsEmpty())280 {281 Console.WriteLine("Queue is Empty !");282 return default(T);283 }284 QueueNode p =front;285 front =front.Next;286
287 if (front == null)288 {289 rear = null;290 }291 --size;292 returnp.Data;293 }294
295 //獲取鏈隊列頭結點的值
296 publicT GetFront()297 {298 if(IsEmpty())299 {300 Console.WriteLine("Queue is Empty !");301 return default(T);302 }303 returnfront.Data;304 }305
306 }307
308
309 ///
310 ///銀行叫號鏈隊列類311 ///
312 class LinkBankQueue : LinkQueue, IBankQueue313 {314 private intcallnumber;315
316 public intCallnumber317 {318 get { returncallnumber; }319 set { callnumber =value; }320 }321
322 //獲取服務號碼
323 public intGetCallnumber()324 {325 if ((IsEmpty()) && callnumber == 0)326 {327 callnumber = 1;328 }329 else
330 callnumber++;331 returncallnumber;332 }333 }334
335 ///
336 ///銀行叫號順序隊列類337 ///
338 class CSeqBankQueue : CSeqQueue, IBankQueue339 {340 private int callnumber; //記錄系統自動產生的新來顧客的服務號碼
341
342 public intCallnumber343 {344 get { returncallnumber; }345 set { callnumber =value; }346 }347
348 publicCSeqBankQueue()349 {350
351 }352
353 public CSeqBankQueue(intsize)354 : base(size)355 {356
357 }358
359 //獲得服務號碼
360 public intGetCallnumber()361 {362 if ((IsEmpty()) && callnumber == 0)363 {364 callnumber = 1;365 }366 else
367 {368 callnumber++;369 }370 returncallnumber;371 }372 }373
374 ///
375 ///服務窗口類376 ///
377 classServiceWindow378 {379 IBankQueue bankQ;380
381 //服務隊列屬性
382 publicIBankQueue BankQ383 {384 get { returnbankQ; }385 set { bankQ =value; }386 }387
388 public voidService()389 {390 while (true)391 {392 Thread.Sleep(10000);393 if (!bankQ.IsEmpty())394 {395 Console.WriteLine();396 lock(bankQ)397 {398 Console.WriteLine("請{0}號到{1}號窗口!", bankQ.DeQueue(), Thread.CurrentThread.Name);399 }400 }401 }402 }403 }404
405 classQueue406 {407
408 static voidMain()409 {410 IBankQueue bankQueue = null;411 Console.WriteLine("請選擇存儲結構的類型:1.順序隊列 2.鏈隊列:");412 char selectFlag =Convert.ToChar(Console.ReadLine());413 switch(selectFlag)414 {415 /*初始化順序隊列*/
416 case '1':417 int count; //接受循環順序隊列的容量
418 Console.WriteLine("請輸入隊列可容納的人數:");419 count =Convert.ToInt32(Console.ReadLine());420 bankQueue = newCSeqBankQueue(count);421 break;422 /*初始化鏈隊列*/
423 case '2':424 bankQueue = newLinkBankQueue();425 break;426
427 }428 int windowcount = 4; //設置銀行柜臺的服務窗口數
429
430 ServiceWindow[] sw = newServiceWindow[windowcount];431 Thread[] swt = newThread[windowcount];432 for (int i = 0; i < windowcount; i++)433 {434 sw[i] = newServiceWindow();435 sw[i].BankQ =bankQueue;436 swt[i] = new Thread(newThreadStart(sw[i].Service));437 swt[i].Name = "" + (i + 1);438 swt[i].Start();439 }440 while (true)441 {442 Console.WriteLine("請點擊觸摸屏獲取號碼:");443 Console.ReadLine();444
445 intcallnumber;446 if (!bankQueue.IsFull())447 {448 callnumber =bankQueue.GetCallnumber();449 Console.WriteLine("您的號碼是:{0},您前面有{1}位,請等待!", callnumber, bankQueue.GetLength());450 bankQueue.EnQueue(callnumber);451 }452 else
453 Console.WriteLine("現在業務繁忙,請稍后再來!");454 Console.WriteLine();455 }456 }457 }458 }
總結
以上是生活随笔為你收集整理的c#队列取值_C# 队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ console 取实时输入_灵活
- 下一篇: java遍历字典_Java中的HashM