1.2.3. スタックとキュー

1. 概要

 「スタック」と「キュー」は、データを整理し操作するための基本的なデータ構造です。これらは、データの追加(プッシュ)や削除(ポップ)といった操作を効率的に行うために設計されており、プログラム内でのデータ管理において重要な役割を果たします。スタックはLIFO(Last In, First Out)、キューはFIFO(First In, First Out)の原則に従ってデータを処理します。この違いが、特定の用途においてどちらのデータ構造を使うべきかを決定します。これらのデータ構造を理解することは、アルゴリズムを効率的に設計・実装するための基礎となります。

2. 詳細説明

スタック(Stack)
 スタックは、後入れ先出し(LIFO: Last In, First Out)のデータ構造です。スタックにデータを追加する操作を「プッシュ(push)」、データを取り出す操作を「ポップ(pop)」と呼びます。スタックは、関数の呼び出しや再帰処理など、プログラムの制御構造でよく使われます。例えば、計算式の評価やブラウザの「戻る」ボタンの履歴管理などが挙げられます。

キュー(Queue)
 キューは、先入れ先出し(FIFO: First In, First Out)のデータ構造です。キューにデータを追加する操作を「エンキュー(enqueue)」、データを取り出す操作を「デキュー(dequeue)」と呼びます。キューは、タスクのスケジューリングやプリンタのジョブ管理、待ち行列のシミュレーションなど、順序が重要な処理で広く用いられます。

3. 応用例

スタックの応用例
 スタックは、プログラムの実行時に関数の呼び出し元に戻るための管理(コールスタック)に使われます。また、テキストエディタの「取り消し(Undo)」機能や、深さ優先探索(DFS: Depth First Search)アルゴリズムの実装にもスタックが使用されます。

キューの応用例
 キューは、タスクが順次処理される場面で活躍します。例えば、OSのプロセススケジューリングでは、プロセスが実行待ち状態にある間、キューに格納されます。また、ネットワークのパケット処理や、幅優先探索(BFS: Breadth First Search)アルゴリズムの実装にも利用されます。

4. 例題

例題1
次の操作を行った後、スタックに残っている要素を答えてください。

  1. スタックにAをプッシュ
  2. スタックにBをプッシュ
  3. スタックからポップ
  4. スタックにCをプッシュ

回答例
スタックに残っている要素は、C, A です。


例題2
次の操作を行った後、キューに残っている要素を答えてください。

  1. キューに1をエンキュー
  2. キューに2をエンキュー
  3. キューからデキュー
  4. キューに3をエンキュー

回答例
キューに残っている要素は、2, 3 です。

5. まとめ

 スタックとキューは、データの追加と削除を管理する基本的なデータ構造です。スタックはLIFO、キューはFIFOの原則に従い、それぞれ異なる用途で使われます。スタックは、関数の呼び出し管理やアルゴリズムの制御に適しており、キューは、順序を保つ必要があるタスク管理に適しています。これらのデータ構造を理解し、適切に使いこなすことは、プログラミングやアルゴリズムの効率を向上させるために不可欠です。