Queue<T> / Stack<T>
| 対応: | C# 2.0(2005) |
|---|
先入れ先出し(FIFO)のコレクション『Queue<T>』と、後入れ先出し(LIFO)のコレクション『Stack<T>』です。
構文
// キュー(先入れ先出し)を作成します。 Queue<T> queue = new Queue<T>(); // スタック(後入れ先出し)を作成します。 Stack<T> stack = new Stack<T>();
メソッド一覧
| メソッド | Queue / Stack | 概要 |
|---|---|---|
| Enqueue(item) | Queue | 末尾に要素を追加します。 |
| Dequeue() | Queue | 先頭の要素を取り出して削除します。空の場合は例外が発生します。 |
| Peek() | Queue / Stack | 先頭(または先端)の要素を削除せずに参照します。 |
| Push(item) | Stack | 先端に要素を追加します。 |
| Pop() | Stack | 先端の要素を取り出して削除します。空の場合は例外が発生します。 |
| TryDequeue(out T) | Queue | 取り出しを試みて、空なら false を返します(例外なし)。 |
| TryPop(out T) | Stack | 取り出しを試みて、空なら false を返します(例外なし)。 |
| Count | Queue / Stack | 要素数を返します。 |
サンプルコード
Program.cs
using System;
using System.Collections.Generic;
// Queue(先入れ先出し)の例です。
Queue<string> waitingList = new Queue<string>();
waitingList.Enqueue("碇シンジ");
waitingList.Enqueue("綾波レイ");
waitingList.Enqueue("惣流アスカ");
Console.WriteLine($"先頭: {waitingList.Peek()}"); // 碇シンジ(削除しない)
while (waitingList.Count > 0) {
string next = waitingList.Dequeue();
Console.WriteLine($"処理中: {next}");
}
// Stack(後入れ先出し)の例です。
Stack<string> history = new Stack<string>();
history.Push("テキスト入力");
history.Push("文字色変更");
history.Push("フォント変更");
// 「元に戻す」機能のイメージです。
Console.WriteLine("元に戻す:");
while (history.Count > 0) {
Console.WriteLine($" 取り消し: {history.Pop()}");
}
// TryDequeue / TryPop で安全に取り出します。
Queue<int> tasks = new Queue<int>();
if (tasks.TryDequeue(out int value)) {
Console.WriteLine($"取得: {value}");
} else {
Console.WriteLine("キューが空です。");
}
dotnet script queue_stack.csx 先頭: 碇シンジ 処理中: 碇シンジ 処理中: 綾波レイ 処理中: 惣流アスカ 元に戻す: 取り消し: フォント変更 取り消し: 文字色変更 取り消し: テキスト入力 キューが空です。
概要
『Queue<T>』は受付・印刷ジョブ・メッセージキューなど「先に入れたものを先に処理する」用途に適しています。『Stack<T>』はエディタの「元に戻す(Undo)」機能・ブラウザの戻るボタン・式の解析など「直近の操作を逆順に処理する」用途に使われます。
空のコレクションに対して『Dequeue()』や『Pop()』を呼ぶと例外が発生します。安全に取り出すには『TryDequeue()』『TryPop()』を使用してください。
重複なしのコレクションは『HashSet<T>』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。