今回は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はスレッド間のデータのやりとりなど、使う機会も多いと思いますのでぜひ覚えておきましょう。
