配列を用いたスタックの実装

■ 解き方の方針 stackPosの意味を読み違えないことが最重要です。問題文では、stackPosは現在の最上位要素ではなく、 次に値を格納する空き位置 を示すと定義されています。 ■ 初期状態を図の代わりに整理する stack[1]=4、stack[2]=3で、二つの要素が格納済みです。 stack[3]とstack[4]は空き領域です。 stackPos=3なので、次のpushはstack[3]へ書き込みます。 ■ pushの空欄a pushでは、次の空き位置へinputDataを格納してから、stackPosを1増やします。したがって書込み先は stack[stackPos] であり、aはstackPosです。 ■ popの空欄b stackPosは空き位置を指しているので、最後に格納した要素はその一つ前にあります。popでは、先にstackPosを1減らし、その位置の値を取り出します。 よって、bはstackPos-1です。「減らしてから読む」という順序が重要です。 ■ 短いトレースで確認する 初期状態で push(7) を実行すると stack[3] に7を格納して stackPos は4になり、続けて pop() を実行すると stackPos を3に戻してから stack[3] の7を取り出します。pushした7が直後のpopで返るので、LIFOの動作になっています。 ■ 正解と誤答の見分け方 a=stackPos、b=stackPos-1の イ が正解です。pushでstackPos-1へ書くと既存の最上位要素を上書きし、popでstackPosを増やすと空き領域又は配列外へ進んでしまいます。

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

関数 pushは 引数で与えられた整数をスタックに格納する。格納できた場合はtrue を返し、格納できなかった場合は false を返す。
関数 popは、スタックから値を取り出して返す。スタックが空のときは未定義の値を返す。
スタックを、要素数が4である大域の整数型の配列 stack, 及び次に値を格納する位置を示す大域の変数 stackPos で表現する。スタックの初期状態を図に示す。プログラムでは、配列の領域外を参照してはならないものとする。

問題画像

[プログラム]
大域:整数型: 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

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

a

b

ア

stackPos

stackPos + 1

イ

stackPos

stackPos - 1

ウ

stackPos - 1

stackPos + 1

エ

stackPos - 1

stackPos - 1