導入
List は「どこでも自由に出し入れ」できますが、実務では取り出す順番にルールがある入れ物が欲しい場面が多くあります。行列のように「先に入れたものから出す」Queue、本の山のように「後に入れたものから出す」Stack——この2つは順番待ち処理や「元に戻す(Undo)」機能の土台になります。
図解
flowchart LR
subgraph Queue["Queue(FIFO・先入れ先出し)"]
direction LR
QI["入口 Enqueue"] --> QA["A B C"] --> QO["出口 Dequeue → A"]
end
subgraph Stack["Stack(LIFO・後入れ先出し)"]
direction TB
SI["Push ↓ Pop ↑"] --- SA["3<br/>2<br/>1 → Pop で 3 が先"]
end
サンプル
// Queue<T>: 先入れ先出し(FIFO)。順番待ち・処理待ち行列
var queue = new Queue<string>();
queue.Enqueue("A"); // 末尾に追加
queue.Enqueue("B");
queue.Enqueue("C");
Console.WriteLine(queue.Dequeue()); // A ← 最初に入れたものが最初に出る
Console.WriteLine(queue.Peek()); // B ← 次に出る要素を「見るだけ」(取り出さない)
Console.WriteLine(queue.Count); // 2
// Stack<T>: 後入れ先出し(LIFO)。Undo・履歴・戻る操作
var stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);
Console.WriteLine(stack.Pop()); // 3 ← 最後に入れたものが最初に出る
Console.WriteLine(stack.Pop()); // 2
// 「もっと自由な両端出し入れ」が要るときは LinkedList<T> という選択肢もある
Queue<T>はFIFO(先入れ先出し)。Enqueueで追加、Dequeueで取り出し、Peekで先頭を確認Stack<T>はLIFO(後入れ先出し)。Pushで追加、Popで取り出し、Peekで先頭を確認- 「順番待ち」はQueue、「元に戻す・履歴」はStack、が典型的な使いどころ
演習
var tasks = new Queue<string>();
tasks.Enqueue("洗濯");
tasks.Enqueue("料理");
tasks.Enqueue("掃除");
// TODO: 最初に処理すべきタスク(先頭)を取り出して出力してください("洗濯")
___
- 期待される出力:
洗濯
ヒント1を見る
先入れ先出しなのでDequeue()で先頭を取り出せます
ヒント2を見る
Console.WriteLine(tasks.Dequeue());
まとめ
Queue<T>はFIFO(Enqueue/Dequeue)、Stack<T>はLIFO(Push/Pop)- どちらも
Peekで「次に出る要素」を取り出さずに確認できる - 順番待ちはQueue、Undo・履歴はStack
次回: 自分で「1件ずつ生成する列」を作るyieldとIEnumerableです。