実装のアイデア:
1)配列の最初の要素を指すようにキューヘッドフロント= 0を設定します。
2)配列の最後の次の要素を指すようにキューの末尾をリア= 0に設定し、フロント==リアキューを空にする
3)プログラムが満杯か空かをプログラムが理解しやすいように、キューの最初と最後にスペースを残します。キューがいっぱいの状態が(リア+ 1)%maxSizeであり、空の位置が常に変化していることを確認します
4)キューの有効なデータ計算式、リアフロント+ maxSize%maxSize(この場所はより抽象的です。円形の配列を描くと、グループが理解しやすくなります)
1 システムの使用; 2 3 名前空間データ構造 4 { 5 パブリック クラスCircleQueue 6 { 7 // キューの最大容量 8 private int maxSize; 9 // キューの 先頭10 private int front; 11 // キューの終わり 12 private int 後; 13 / / キュー配列 14 private int [] arrayQueue; 15 // キューの最後の次の位置。 先頭と一致する場合、キューはいっぱいです 16 // キューのテールになるよう空の位置は、キューが機能するよりよいので空であるかどうかが決定される 17。 公的 BOOL IsFull { GET =>(+リア1)maxSizeの%== フロント;} 18は 、// 同時に同じ場所にヘッドとテールポイントが空であります 19 public bool IsEmpty { get => front == Rear ;} 20 // キューの残りのデータ 21 public int Size { get =>(maxSize + Rear -front)%maxSize;} 22 23 public CircleQueue(int maxSize = 1 ) 24 { 25 //キューは空のままなので、最大値を 26 増やす必要がありますthis .maxSize = maxSize + 1 ; 27 arrayQueue = new int [ this .maxSize]; 28 // キューの先頭を 指す29 this .front = 0 ; 30 // 3つのキューの先頭であるキューの最後の次の位置を 指す31 this .rear = 0 ; 32 } 33 // エントリ 34 public bool AddQueue(int item) 35 { 36 if (IsFull) 37 { 38 Console.WriteLine(" キューがいっぱいです... " ); 39 return false ; 40 } 41 arrayQueue [リア] = アイテム; 42 // テールは次の位置を指します 43 リア=(リア+ 1)%this .maxSize 、 44である リターン trueに; 45 } 46である // デキュー 47 公衆 INT getQueue() 48 { 49 IF (のisEmpty) 50 { 51 throw new IndexOutOfRangeException("The queue is empty ... " ); 52 53 } 54 // 次の位置に移動する 55 var val = arrayQueue [front]; 56 front =(front + 1)%this .maxSize; 57 return val; 58 } 59 } 60 61 public class CircleQueueDemo 62 { 63 static void Main(string [] args) 64 { 65 // 初期化キュー 66 var queue = new CircleQueue(9 ); 67 Console.WriteLine($ " 現在のキューの長さは{queue.Size} " ); 68 Console.WriteLine(" 長さは10エンキュー番号9 \ N- " ;) 69 のための(INT I = 1 ; I <= 10、I ++は) 70 { 71である 72 IF (queue.IsFull) 73です { 74 Console.Write(" キューがいっぱいです" 10 "チームに参加できませんでした、" ); 75 ブレーク; 76 } 77 if (queue.AddQueue(i)) 78 { 79 Console.Write($ " {i} \ t " ) ; 80 } 81 82 } 83 Console.WriteLine($ " 現在のキューの長さは{queue.Size}です\ t " ); 84 85 // ------------------- ---------------------------------------- 86 87 Console.WriteLine(" キュー内の5つの数値... \ n " ); 88 for(int i = 1 ; i <= 5 ; i ++ ) 89 { 90 91 Console.Write($ " {queue.GetQueue() } \ t " ); 92 93 } 94 Console.WriteLine($ " 現在のキューの長さは{queue.Size}です\ n " ); 95 96 // ---------------- ------------------------------------------- 97 98 Console.WriteLine(" キューに10個の数値を挿入... \ n " ); 99 for(int i = 1 ; i <= 10 ; i ++ ) 100 { 101 if (queue.IsFull) 102 { 103 Console.Write (" キューがいっぱいです。" 6 7 8 9 10 "チームに参加できませんでした" " ; 104 ブレーク; 105 } 106 if (queue.AddQueue(i)) 107 { 108 Console.Write($ "} I {\ T " ); 109 } 110 111 } 112 Console.WriteLineを($ " 現在のキューの長さqueue.Size} {\ N- " ); 113 114 // ----------------------- ----------------------------------------------- 115 1 16 コンソール.WriteLine($ " 現在のキューを印刷" ); 117 var size = queue.Size; 118 for(int i = 0 ; i <size; i ++ ) 119 { 120 Console.Write($ " {queue.GetQueue()} \ t " ); 121 } 122 Console.WriteLine($ " 現在のキューの長さは{queue.Size} \ n " ); 123 } 124 } 125 }