予選問題2 解答と解説

正解
inihniinkaiooi

 スタックとは何かを知っていれば容易に解答出来る問題であるが、 そうでない場合には問題1のようにプログラムの実行を追うのはかなり 大変であろう。スタックのような基本的なデータ構造は知っておくとよい。

         入  出          |     |              |-----|
         ↓  ↑          |     |              |  x  |
       |        |        |-----| xをプッシュ  |-----|
       |--------|        |     | -------->    |     |
       |   x4   |        |     |              |     |
       |--------|        |     |              |     |
       |   x3   |         -----                -----
       |--------|
       |   x2   |        |     |              |     |
       |--------|        |-----|              |     |
       |   x1   |        |  y  | yをポップ    |     |     
        --------         |-----| -------->    |-----|
                         |     |              |     |
                         |     |              |     |
                         |     |              |     |
                          -----                -----

図1(スタック)

                    ---------
          stack[6] |    ?    |  depth=6
                    ---------
          stack[5] |    ?    |
                    ---------
          stack[4] |    x4   |← stkPtr  
                    ---------
          stack[3] |    x3   |
                    ---------
          stack[2] |    x2   |
                    ---------
          stack[1] |    x1   |
                    ---------

図2(スタックの配列による表現)

 スタック(stack)とは、図1のような構造をした入れ物を表す データ構造である(この例では、入れ物のサイズ(深さ)は6、既に4個のデータが入っている)。 この入れ物には同種類のデータだけを出し入れできるが、出し入れ口は上方に 一つしかないため、データを入れる際は既に入っているデータの上に積み (これをプッシュ(push)と呼ぶ)、データを取り出す際は既に入っているデータ の中で一番上にあるもの(これをスタックのトップ(top)と呼ぶ)から順次取り出す しかない。スタックからトップのデータを取り出すことをポップ(pop up)と呼ぶ。
 問題のプログラムでは、スタック(深さ=depth)を配列 stack[1..depth] を 用いて表しており、スタックのトップがどこにあるかは配列の添字 stkPtr で 表されている。stkPtr≦0 なら配列が空であることを、stkPtr>depth なら スタックがあふれたこと(overflow)を表す。関数(手続き)push(x) によって x がスタックにプッシュされ、popによってスタックのトップがポップされる。 主プログラム部分(main関数)では、空のスタック(stkPtr:=0)からスタートし、 入力データを1文字ずつ変数 x に読み込みながら、スタックが空(stkPtr=0)なら x をプッシュ、空でない場合は x  以上のことを念頭に置けば、プログラムの動作(スタックの変化)は容易に シミュレートできるであろう。