過去問解きまくり研究所 ホーム

令和7年度 科目B 問3

データ構造

スタックに関する問題

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

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

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

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

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

図 スタックの初期状態:

要素番号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

解答群は原典では a・b の組合せの表。

答えと解説を見る

✓ これが正解イa:stackPos / b:stackPos - 1

解説

stackPosは空きを指すので、pushはそこへ、popは1戻して読みます。

スタックは、最後に入れた値を最初に取り出すデータ構造で、LIFOとも呼ばれます。この問では、配列stackと、次に値を格納する位置を示すstackPosで表しています。軸は、stackPosが指すのは空いている場所であって、最後に入れた値のある場所ではない、という一点です。初期状態でも、値の入っている要素番号は1と2で、stackPosは空きの3を指しています。

pushは、空きの位置であるstack[stackPos]にそのまま値を書き、その後でstackPosに1を足して次の空きを指させます。例えばpush(5)を呼ぶと、stackPos=3は要素数4以下なのでstack[3]に5が入り、stackPosは4になります。続けてpush(6)でstack[4]に6が入りstackPosは5、さらにpush(7)では5が4を超えるのでfalseを返し、配列の外には書きません。

popは逆に、まずstackPosから1を引いて最後に値が入った位置へ戻し、そこから値を読み出します。stackPos=5の状態でpopを呼ぶと、stackPosは4になり、stack[4]の6が返って、その要素は未定義の値に戻ります。直前に入れた6が最初に出てくるので、スタックとして正しく動いています。よって、aはstackPos、bはstackPos - 1の組合せです。

見分け方は、位置を示す変数が次の空きを指すのか最後の値を指すのかを初期状態の図から読み取り、書く前に動かすか後に動かすかを決めることです。

ほかの選択肢はなぜ違うのか

出典:令和7年度 基本情報技術者試験 科目B 問3

この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)