Queue(キュー:待ち行列)
Queueは、データ構造の学習の際にスタックと並んで紹介される、基本的かつ便利な待ち行列というデータ構造を基にしたコレクションです。先に入れたものが先に出てくる、ところてん方式のデータ構造で、Queueにデータを入れることをエンキュー(Enqueue)、Queueからデータを取り出すことをデック(Dequeue)と呼びます。
これ一つでたいそうな構造を持っているようなイメージがありますが、実はとても簡単な構造をしていて、要素にアクセスするための変数と配列を利用すれば、手軽に同様の構造を作り出すことができます。コレクションに用意されているQueueがそういった単純なものを使って実現した待ち行列構造と違うのは、様々な型のデータをまとめて取り扱うことができるという点、また、データの記憶領域の管理をコレクション側に任せることができるという点です
Queueサンプルプログラムの解説
Queue q = new Queue();
q.Enqueue(1);
q.Enqueue("two");
q.Enqueue(3.14);
Console.WriteLine("Queu size : {0}", q.Count);
Console.WriteLine("1st Dequeue : {0}", q.Dequeue());
Console.WriteLine("2nd Dequeue : {0}", q.Dequeue());
Console.WriteLine("Queu size : {0}", q.Count);
q.Enqueue(4);
Console.WriteLine("Enqueue");
Console.WriteLine("Queu size : {0}", q.Count);
Console.WriteLine("3rd Dequeue : {0}", q.Dequeue());
Queu size : 3 1st Dequeue : 1 2nd Dequeue : two Queu size : 1 Enqueue Queu size : 2 3rd Dequeue : 3.14
サンプルプログラムでは、最初に3つの値をEnqueueしています。その後、2回のDequeueを経て、再度Enqueueしています。注目していただきたいのはEnqueueのたびに要素数が増え、Dequeueのたびに要素数が減っているという点です。Queueは待ち行列構造をしていますから、Dequeueメソッドはオブジェクトを返すと同時に、Queue内からオブジェクトを削除していきます。他のコレクション同様、オブジェクトであれば何でも格納できるので、自作ゲームのジョブリストやメッセージリストを保持しておくのに役立ちます。
Queueの基本的な使い方
Enqueue(value)メソッドでオブジェクトを入れるDequque()メソッドでオブジェクトを取り出す
というのが基本操作になります。
Peekメソッドを用いれば、要素を削除せずに取り出すことができます。またDequeueメソッド、PeekメソッドはO(1)で動作しますので、速度面での心配はありません。待ち行列構造ですから、配列形式のコレクションやHashtableなどと違い、特定の要素にアクセスするための手段は用意されていません。また、Queueにはnull参照をEnqueueすることが可能です。
DeququeメソッドはQueueが空の時にはInvalidOperationException例外を投げてきますので、Queueが空か否かを判断するためにはこの例外を捕まえるか、Countメソッドを利用して要素の数をチェックしていく必要があります。
個人的な意見としては、例外はあくまで例外であるため、Countメソッドを利用して要素数をチェックしながらDequeueメソッドを呼び出す方式をおすすめします
Queueを使う上での注意点
コンストラクタで容量を指定した場合、Queueの容量がその量より少なくなっても、ずっとその量を保ち続けるという点に注意が必要です。これによって実際にQueueにある要素が3なのに対し、その容量は10のままなどという状態が発生します。このような状態を避けるために、TrimToSizeメソッドが用意されています。このメソッドを呼び出すことで、Queueの容量を、内包されている要素の数に合わせることができます。
