プログラミングを学んでいると、「スタック」と「キュー」という用語に出会うことがあります。どちらもデータ構造の基本的な概念ですが、データの出し入れの仕組みが大きく異なります。
この記事では、スタックとキューの違いをわかりやすく解説し、それぞれの特徴や使いどころを紹介します。
スタック(Stack)とは
スタックは、後入れ先出し(LIFO: Last In, First Out)方式のデータ構造です。最後に追加されたデータが最初に取り出されます。
身近な例でいうと、積み重ねた本やお皿をイメージするとわかりやすいでしょう。一番上に置いたものを最初に取り出しますよね。これがスタックの仕組みです。
スタックの基本操作
スタックには主に以下の操作があります。
- push(プッシュ):データをスタックの一番上に追加する
- pop(ポップ):スタックの一番上からデータを取り出す
- peek / top:一番上のデータを確認する(取り出さない)
- isEmpty:スタックが空かどうかを確認する
スタックの活用例
- ブラウザの「戻る」ボタンの履歴管理
- テキストエディタの「元に戻す(Undo)」機能
- プログラムの関数呼び出し管理(コールスタック)
- 括弧の対応チェック(コンパイラの構文解析)
- 深さ優先探索(DFS)アルゴリズム
キュー(Queue)とは
キューは、先入れ先出し(FIFO: First In, First Out)方式のデータ構造です。最初に追加されたデータが最初に取り出されます。
身近な例でいうと、レジに並ぶ行列をイメージするとわかりやすいでしょう。先に並んだ人から順番に会計を済ませていきます。これがキューの仕組みです。
キューの基本操作
キューには主に以下の操作があります。
- enqueue(エンキュー):データをキューの末尾に追加する
- dequeue(デキュー):キューの先頭からデータを取り出す
- peek / front:先頭のデータを確認する(取り出さない)
- isEmpty:キューが空かどうかを確認する
キューの活用例
- プリンタの印刷ジョブの順番管理
- Webサーバーへのリクエスト処理の順番管理
- メッセージキュー(RabbitMQ、Amazon SQSなど)
- 幅優先探索(BFS)アルゴリズム
- OSのタスクスケジューリング
スタックとキューの違い【比較表】
| 比較項目 | スタック(Stack) | キュー(Queue) |
|---|---|---|
| データの取り出し順 | 後入れ先出し(LIFO) | 先入れ先出し(FIFO) |
| データの追加 | push(上に積む) | enqueue(末尾に追加) |
| データの取り出し | pop(上から取る) | dequeue(先頭から取る) |
| イメージ | 積み重ねた本・お皿 | レジの行列・待ち行列 |
| 操作する端 | 片方の端のみ(top) | 両端(front と rear) |
| 代表的なアルゴリズム | 深さ優先探索(DFS) | 幅優先探索(BFS) |
| 計算量(追加・取出) | O(1) | O(1) |
どちらを使うべき?選び方のポイント
スタックとキューの使い分けは、データをどの順番で処理したいかによって決まります。
スタックを使う場面:直近の操作を優先して処理したい場合に向いています。「元に戻す」機能や再帰処理など、最後に入れたデータから順に処理するケースで使います。
キューを使う場面:到着順に公平に処理したい場合に向いています。リクエストの順番管理やタスクの待ち行列など、先に来たものから順に処理するケースで使います。
発展的なデータ構造
スタックとキューを理解したら、以下の発展的なデータ構造も覚えておくと役立ちます。
- デック(Deque):両端からデータの追加・取り出しができるデータ構造。スタックとキューの両方の性質を持つ
- 優先度付きキュー(Priority Queue):データに優先度を付け、優先度が高いものから取り出すキュー。ダイクストラ法などで使用
- 循環キュー(Circular Queue):配列の末尾と先頭をつなげたリング状のキュー。メモリ効率が良い
まとめ
スタックとキューは、プログラミングの基礎となるデータ構造です。最大の違いはデータの取り出し順序にあります。
- スタック:後入れ先出し(LIFO)。最後に追加したデータを最初に取り出す
- キュー:先入れ先出し(FIFO)。最初に追加したデータを最初に取り出す
どちらもアルゴリズムやシステム設計で頻繁に登場する概念なので、それぞれの特徴と使いどころをしっかり理解しておきましょう。特にプログラミングの技術面接では、スタックとキューに関する問題が頻出するため、実際にコードで実装してみることをおすすめします。
プログラミングを本格的に学びたい方へ
この記事で紹介した技術をより深く学びたい方には、実践的なカリキュラムで学べるプログラミングスクールがおすすめです。


コメント