スタック

データ構造のスタックは、後入れ先出し【LIFO:Last-In, First-Out】の方式で要素を追加・削除することができるデータ構造です。

後入れ先出しとはその名の通り、後に入れたものが先に出されるデータ構造をいいます。

例えば、本棚の一番上に書籍を重ねていく場合を考えてみましょう。最初に置かれた書籍は本棚の底にあり、その上に順番に書籍が重ねられます。最後に重ねられた書籍が一番上にくるため、最後に置いた書籍から順に取り出すことができます。スタックも同様で、新しい要素は常にトップに追加され、トップから取り出されます。

スタックでは、新しい要素は常にスタックのトップに追加されます。スタックのトップにある要素は、最後に追加された要素であり、スタックから削除される要素も同じ要素です。それぞれプッシュ【push】とポップ【pop】操作で実現されます。

スタックは、再帰的なアルゴリズムなど様々なアプリケーションで使用されます。また、関数の呼び出しや式の評価など、プログラミングにおいてもよく使われます。

以下はスタックの利用例です。

  • 関数呼び出し:関数を呼び出すと、関数がスタックにプッシュされます。関数が終了すると、スタックからポップされます。この方法により、プログラムがどこに戻る必要があるかを追跡できます。
  • ブラウザ履歴:ブラウザの「戻る」ボタンをクリックすると、前のページに戻ります。この機能は、スタックを使用して実装されています。現在のページがスタックにプッシュされ、前のページがポップされます。
  • 式の評価:数式の評価中に、演算子をスタックにプッシュします。演算子の優先順位を考慮して、スタックから演算子をポップして式を評価します。
  • メモリの割り当て:プログラムがメモリを使用するとき、メモリの割り当てはスタックによって管理されます。新しいメモリが必要な場合、スタックから空いている領域が取り出されます。

スタックは、プログラミングやコンピュータサイエンスにおいて、多くの場面で使用される便利なデータ構造の1つです。

スタックを配列を使って実装する

<サンプルプログラム>

なお、単にスタックを利用するなら以下のjava.util.Stackを使うほうが便利です。

java.util.Stack

Javaの java.util.Stack クラスは、スタックを実装するためのクラスで、LIFO(後入れ先出し)のデータ構造を提供します。以下は、 java.util.Stack クラスで使用できる主なメソッドの一覧です。

  • push(E element):スタックに要素をプッシュします。
  • pop():スタックから要素をポップし、その要素を返します。
  • peek():スタックのトップ要素を返しますが、削除しません。
  • empty():スタックが空であるかどうかを返します。

<サンプルプログラム>

<出力結果>

ポップした要素: kiyome
トップ要素: habutai
スタックは空ですか? false

練習問題

基本情報技術者試験 令和元年秋期 午前問8

練習問題

基本情報技術者試験 平成24年春期 午前問6

練習問題

HTMLのタグ(<>)の対応をチェックするTagCheckerをjava.util.Stackを使い作成しなさい。

<出力結果>

true
true
true
true
false
false