今回はC#のキュー(Queue)についてです。
キューは基本的なデータ構造の一つで先入れ先出しの構造でデータを保持します。
データを入れる操作をエンキュー、取り出す操作をデキューと言います。
C#ではQueueというクラスが用意されています。
stringのキューを使ってみます。
public void Test1() { var queue = new Queue<string>(); queue.Enqueue("a"); queue.Enqueue("b"); queue.Enqueue("c"); queue.Enqueue("d"); queue.Enqueue("e"); queue.Enqueue("f"); Console.WriteLine(queue.Count); }
まずはインスタンスを生成しています。
stringのキューなので、Queue
数値であれば Queue
そしてEnqueueで文字列a~fまでをキューに入れています。
queue.Countでキューの要素数を取得できます。
次は要素を取り出してみます。
public void Test2() { var queue = new Queue<string>(); queue.Enqueue("a"); queue.Enqueue("b"); queue.Enqueue("c"); queue.Enqueue("d"); queue.Enqueue("e"); queue.Enqueue("f"); var str = queue.Dequeue(); Console.WriteLine(str); Console.WriteLine(queue.Count); }
Dequeueでキューから要素を取り出します。
キューは先入れ先出しなので、始めに入れた a が str に入ります。
そしてqueue.Countは一つ減って 5 となります。
queueに要素がない場合にDequeueすると例外が発生するので注意が必要です。
先頭の要素をキューから取り出さずに取得したい場合もあるかと思います。
そのような時はPeekを使用します。
public void Test3() { var queue = new Queue<string>(); queue.Enqueue("a"); queue.Enqueue("b"); queue.Enqueue("c"); queue.Enqueue("d"); queue.Enqueue("e"); queue.Enqueue("f"); var str = queue.Peek(); Console.WriteLine(str); Console.WriteLine(queue.Count); str = queue.Dequeue(); Console.WriteLine(str); Console.WriteLine(queue.Count); }
Peekはキューの先頭要素を取得できますが、キューから除きません。
なのでqueue.Countは 6 のままで、
その後のDequeueでも同じ要素が取得できます。
他にも配列のメソッドを使用する場合も
キューから除かずに取得できます。
public void Test4() { var queue = new Queue<string>(); queue.Enqueue("a"); queue.Enqueue("b"); queue.Enqueue("c"); queue.Enqueue("d"); queue.Enqueue("e"); queue.Enqueue("f"); var array = queue.ToArray(); Console.WriteLine(queue.Count); }
ToArrayでキューの要素の配列を取得できますが、
queue.Countは 6 のままとなります。
queueはスレッド間のデータのやりとりなど、使う機会も多いと思いますのでぜひ覚えておきましょう。