問3 配列と位置の変数で作るスタック

基本情報​技術者試験 令和7年度 公開問題 科目B、全6問のうちの問3。

出典:令和7年度 基本情報技術者試験 公開問題 科目B 問3(図とプログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。図は要素番号と中身の表にし、網掛け (未定義) は「未定義」と書いた。stackPos の矢印は図の題に書いた。空欄は[ a ][ b ]で、解答群の表は 1 行の文に組み直した)

次のプログラム中の[ a ]と[ b ]に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。

関数 push は,引数で与えられた整数をスタックに格納する。格納できた場合は true を返し,格納できなかった場合は false を返す。

関数 pop は,スタックから値を取り出して返す。スタックが空のときは未定義の値を返す。

スタックを,要素数が 4 である大域の整数型の配列 stack,及び次に値を格納する位置を示す大域の変数 stackPos で表現する。スタックの初期状態を図に示す。

プログラムでは,配列の領域外を参照してはならないものとする。

図 スタックの初期状態 (未定義は原本では網掛け。stackPos は要素番号 3 を指す)
要素番号1234
stack43未定義未定義
〔プログラム〕
大域: 整数型: stackPos ← 3
大域: 整数型の配列: stack ← {4, 3, 未定義の値, 未定義の値}
 
○論理型: push(整数型: inputData)
if (stackPos ≦ stackの要素数)
stack[[ a ]] ← inputData
stackPos ← stackPos + 1
return true
else
return false
endif
 
○整数型: pop()
整数型: popData ← 未定義の値
if (stackPos > 1)
stackPos ← [ b ]
popData ← stack[stackPos]
stack[stackPos] ← 未定義の値
endif
return popData
  1. アa stackPos,b stackPos + 1
  2. イa stackPos,b stackPos - 1
  3. ウa stackPos - 1,b stackPos + 1
  4. エa stackPos - 1,b stackPos - 1
答えと解説を開く

正解はイです。

初期状態は stack = {4, 3, 未定義, 未定義}、stackPos = 3 で、3 は空いている最初の位置です。push は、stackPos がまだ配列の中 (stackPos ≦ 4) なら、その位置に値を入れ、stackPos を 1 増やします。値を入れる位置は stackPos そのものなので、a は stackPos です。pop は、最後に入れた値が stackPos の 1 つ手前にあるので、stackPos を 1 減らしてからその位置を読みます。b は stackPos - 1 です。追うと、push(5) で stack[3] ← 5、stackPos ← 4。push(6) で stack[4] ← 6、stackPos ← 5。push(7) は 5 ≦ 4 が偽なので false を返します。ここで pop() を呼ぶと、5 > 1 なので stackPos ← 4、popData ← stack[4] = 6、stack[4] は未定義になり、6 を返します。もう一度 pop() で stackPos ← 3 となり 5 を返し、最後に入れた物から出てきます。正解はイです。

ほかの選択肢が違う理由

  • アpush は合っていますが、pop で stackPos を 1 増やします。初期状態から pop() を呼ぶと stackPos ← 4 で未定義の stack[4] を読み、stackPos が 4 のときに呼ぶと stack[5] と配列の外を指します。
  • ウpush で stackPos - 1 の位置に入れます。初期状態から push(5) を呼ぶと stack[2] の 3 を上書きします。pop も stackPos を増やすので、stackPos が 4 のときに呼ぶと stack[5] と配列の外を指します。
  • エpop は合っていますが、push で stackPos - 1 の位置に入れます。初期状態から push(5) を呼ぶと、入っていた 3 を上書きして stack = {4, 5, 未定義, 未定義} になり、値が 1 つ消えます。

仕組み

スタックは、最後に入れた物を最初に取り出す (後入れ先出し、LIFO) 入れ物です。配列と「次に入れる位置」の変数 1 つで作れます。

位置の変数が「次に入れる位置」を指すのか「最後に入れた位置」を指すのかで、足し引きの順番が変わります。この問いは「次に入れる位置」なので、入れてから進め、戻してから取り出します。

この問に出る言葉