本文へスキップ
BecomeCoder

C#文法コース · 第3章 コレクション · レッスン26

Queue と Stack

ブラウザで完結

導入

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件ずつ生成する列」を作るyieldIEnumerableです。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。