【C#】QueueとStackの違いと使い分け

C# には「Queue(キュー)」と「Stack(スタック)」という代表的なデータ構造が用意されています。どちらもデータを一時的に保存して順序に基づいて取り出すためのコレクションですが、取り出し方に大きな違いがあります。本記事では Queue と Stack の違いと使い分けについて解説します。

Queue(キュー)とは?

Queue は「先入れ先出し(FIFO: First In First Out)」の構造を持つコレクションです。先に入れた要素が先に取り出されます。現実世界では「行列(待ち行列)」に例えられます。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Queue<string> queue = new Queue<string>();

        // データの追加(Enqueue)
        queue.Enqueue("A");
        queue.Enqueue("B");
        queue.Enqueue("C");

        // データの取り出し(Dequeue)
        Console.WriteLine(queue.Dequeue()); // A
        Console.WriteLine(queue.Dequeue()); // B

        // 先頭の確認(Peek)
        Console.WriteLine(queue.Peek()); // C
    }
}

Stack(スタック)とは?

Stack は「後入れ先出し(LIFO: Last In First Out)」の構造を持つコレクションです。後から入れた要素が先に取り出されます。現実世界では「皿の積み重ね」に例えられます。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Stack<string> stack = new Stack<string>();

        // データの追加(Push)
        stack.Push("A");
        stack.Push("B");
        stack.Push("C");

        // データの取り出し(Pop)
        Console.WriteLine(stack.Pop()); // C
        Console.WriteLine(stack.Pop()); // B

        // 最後の要素を確認(Peek)
        Console.WriteLine(stack.Peek()); // A
    }
}

QueueとStackの違い

項目 Queue Stack
データの取り出し順 先入れ先出し(FIFO) 後入れ先出し(LIFO)
追加メソッド Enqueue() Push()
取り出しメソッド Dequeue() Pop()
利用イメージ 行列、タスクの順番処理 履歴管理、再帰的な処理

使い分けの例

  • Queue: 順番通りに処理したい場合(例:印刷ジョブ、メッセージ処理、待機タスクの管理)
  • Stack: 最後に追加したものを優先的に処理したい場合(例:Undo/Redo 機能、再帰アルゴリズム、深さ優先探索)

まとめ

Queue と Stack はシンプルですが非常に強力なデータ構造です。

  • Queue = 先入れ先出し(FIFO)、行列のように使う
  • Stack = 後入れ先出し(LIFO)、積み重ねのように使う

処理の性質に応じて、データを「順番通りに処理する」のか「最後に追加したものを優先する」のかを基準に使い分けましょう。