問題
問3
次のプログラム中のaとbに入れる正しい答えの組合せを、解答群の中から選べ。ここで、配列の要素番号は1から始まる。
関数pushは、引数で与えられた整数をスタックに格納する。格納できた場合はtrueを返し、格納できなかった場合はfalseを返す。
関数popは、スタックから値を取り出して返す。スタックが空のときは未定義の値を返す。
スタックを、要素数が4である大域の整数型の配列stack、及び次に値を格納する位置を示す大域の変数stackPosで表現する。スタックの初期状態を図に示す。
プログラムでは、配列の領域外を参照してはならないものとする。



[出典:基本情報技術者試験 令和7年度(科目B) 問3]
正解
正解は「イ」です。
解説
この問題はスタックの基本操作である「push」と「pop」の動作を正しく理解できるかを問う問題です。スタックは「後入れ先出し(LIFO)」の構造を持つデータ構造で、値を「push」すると一番上に格納され、「pop」でその値が取り出されます。
プログラム内の「push」処理では、次に格納する場所であるstackPosに値を格納するため、aには「stackPos」が入ります。格納した後は次に格納する場所を示す必要があるため、「stackPos + 1」として位置を1つ進めます。
一方、「pop」処理では、まず一つ前の値を取り出すため、「stackPos – 1」として位置を1つ戻します。これにより取り出すべき値の位置にアクセスできます。その後、値を取得したら現在位置の値を未定義にし、次に「pop」される値を正しく示せるようにします。このように、pushは「stackPos」で格納し「stackPos + 1」で進め、popは「stackPos – 1」で戻してから値を取得する動作となります。
日常の例としては、積み重ねた本の山がスタックと同じイメージです。本を積む(push)ときは上から積み重ね、取り出す(pop)ときは一番上から順番に取り出します。この構造が正しく機能するように、配列のインデックス操作も慎重に設計されています。以上から正解は「イ」となります。
ア(stackPos / stackPos + 1):
push時の格納位置が「stackPos」のまでは正しいですが、pop処理で「stackPos + 1」としているため、要素を正しく取得できず、値を取り出す場所を進めてしまうため誤りです。
ウ(stackPos – 1 / stackPos + 1):
push時に「stackPos – 1」としているため、次に格納すべき場所に誤って一つ前の場所に格納してしまいます。pop処理は正しいですが、push処理のミスが致命的です。
エ(stackPos – 1 / stackPos – 1):
pushもpopも両方「stackPos – 1」としているため、格納位置と取り出し位置がどちらも間違っており、スタックが正しく機能しなくなります。
難易度
この問題の難易度は「やや易しい」です。スタック構造という基本的なデータ構造の理解を問う問題ですが、配列とインデックス操作の組み合わせを考える必要があり、初心者には少し混乱しやすいポイントが含まれています。
用語補足
スタック:
データを後から入れたものを先に取り出すLIFO型のデータ構造です。本を積み重ねたり取り出したりする動作と似ています。
push操作:
スタックに新しいデータを積み重ねる操作です。次に格納すべき位置にデータを置いて、インデックスを一つ進めます。
pop操作:
スタックから最後に積んだデータを取り出す操作です。インデックスを一つ戻してから、その位置のデータを取得します。
解法のポイント
スタック構造や配列のインデックス操作は基本ですが、実装時の手順や動きをイメージできることが大切です。図を書いて格納位置と取り出し位置の動きを整理する練習を繰り返すことで、ミスを防げるようになります。


