令和7年度の科目B、その3問目です。スタックという言葉が出てきますが、この問題で使うのは問題文の1文だけ ── stackPos は「次に値を格納する位置」を示す、という1文です。空欄は2つありますが、この1文から両方とも決まります。
出題
まず原文のまま読んでみてください。記号の読み方は次の節にまとめてありますので、読めなくてもここでは問題ありません。
出典:令和7年度 基本情報技術者試験 科目B 公開問題 問3
次のプログラム中の a と b に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1 から始まる。
関数push は,引数で与えられた整数をスタックに格納する。格納できた場合はtrue を返し,格納できなかった場合はfalse を返す。
関数pop は,スタックから値を取り出して返す。スタックが空のときは未定義の値を返す。
スタックを,要素数が4 である大域の整数型の配列stack,及び次に値を格納する位置を示す大域の変数stackPos で表現する。スタックの初期状態を図に示す。
プログラムでは,配列の領域外を参照してはならないものとする。
stack
図 スタックの初期状態(原図では 3番の下に矢印があり、そこが 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
解答群
| a | b | |
|---|---|---|
| ア | stackPos |
stackPos + 1 |
| イ | stackPos |
stackPos - 1 |
| ウ | stackPos - 1 |
stackPos + 1 |
| エ | stackPos - 1 |
stackPos - 1 |
答えだけ先に見る
正解は イ。ただし、この記事は解答群を見ずに式を書く順で進みます。先に答えまで見てしまうと、組み立てをなぞるだけになります。
この問題に出てくる記号と言葉
読めない記号があったときだけ開いてください。先に全部読む必要はありません。
擬似言語の記号と言葉 8コ の読み方をひらく
| 書き方 | 読み方 |
|---|---|
大域: |
関数の外で用意した変数や配列。どの関数からも読み書きできます。この問題では stack と stackPos がそれです |
○論理型: push(...) |
行頭の ○ はここから1つの関数が始まるという印。論理型 は true か false を返すという意味です |
push(整数型: inputData)return |
かっこの中は呼ぶときに渡された値が入る変数です。push(9) と呼べば inputData は 9 になります。return はそこで関数を終えて、値を返すという意味です |
stack[3] |
配列 stack の 3番目の枡。角かっこの中は要素番号で、1 から数えます。変数も書けます |
未定義の値 |
まだ何も入っていないという状態。図では網掛けで示されています |
stackの要素数 |
配列 stack の枡の数。この問題では 4 です |
≦ と > |
a ≦ b は「a が b 以下」で ちょうど b のときも成り立ちます。a > b は「a が b より大きい」で、ちょうど b のときは成り立ちません |
← |
左に書き込む。書かれた側の元の値は消えます |
使うのは、問題文の1文だけ
スタックという言葉に身構えなくて大丈夫です。この問題を解くのに要るのは、問題文のこの1文だけです。
問題文が定義していること
stackPos は 次に値を格納する位置を示す。
初期状態の図を見ると、stackPos は 3 を指していて、3番は網掛け(未定義)です。まだ入っていない場所を指している ── 「次に入れる位置」という定義のとおりです。
指しているのが空の枡だ、というところが効きます。3番から先はまだ空で、値が入っているのは stackPos より手前だけです。書くのは stackPos が指す枡、読めるのはその手前。あとはこれを式にするだけです。
初期状態から、1つ入れて1つ出す
言葉だけだと手ざわりが無いので、実際に動かします。入れるところと、出すところを1回ずつ見ます。
初期状態から、1つ入れて1つ出す
枡=配列 stack / 横長の箱=変数 stackPos / 網掛け=未定義
① 初期状態 stackPos は 3
stack
14
23
3未定義
4未定義
stackPos3
3番はまだ空です。stackPos は「次に入れる位置」なので、最後に入れた 3 は、その1つ手前の 2番にいます。
② push(9) ── 3番に書いて、位置を1つ進める
stack
14
23
39
4未定義
stackPos4
書いた場所は stackPos が指していた 3番。書いたあとに stackPos を 4 へ進めます。
③ pop() は、どの枡なら読めるのか
stack
14
23
39
4未定義
stackPos4
stackPos(4)が指す 4番はまだ空で、その先もずっと空です。そちらを読んでも 未定義の値しか出てきません。値が入っているのは stackPos より手前だけ ── いちばん近いのが 3番です。
書くのは stackPos の位置。読めるのは、その手前 ── いちばん近いのは 1つ手前
コードの中で、a は「どこに書くか」、b は「どこを読むか」
2つの関数に注釈を付けて見ます。空欄はどちらも「配列の何番を指すか」です。
大域: 整数型: stackPos ← 3
次に値を格納する位置。関数の外にあるので両方から見える
大域: 整数型の配列: stack ← {4, 3, 未定義の値, 未定義の値}
値の入れ物。要素数は 4
○論理型: push(整数型: inputData)
格納できたら true、できなかったら false を返す
if (stackPos ≦ stackの要素数)
次に入れる位置が、配列の中に収まっているか
stack[a] ← inputData
空欄a ── どこに書くか
stackPos ← stackPos + 1
書いたので、次に入れる位置を1つ進める
return true
else
return false
いっぱいで入らなかった
endif
○整数型: pop()
取り出した値を返す。空なら未定義の値
整数型: popData ← 未定義の値
返す値。はじめは未定義
if (stackPos > 1)
1つでも入っているか(1 なら空)
stackPos ← b
空欄b ── どこを読むかを、先に決める
popData ← stack[stackPos]
その位置の値を取り出す
stack[stackPos] ← 未定義の値
取り出したので、そこは空にする
endif
return popData
※ 右側の注釈は当サイトで書き加えたものです。プログラム自体は原文のまま引用しています。
空欄に入るものを決める
空欄 a ── 書くのは「次に入れる位置」そのもの
決めるのは、push のこの行です。
〔プログラム〕push の抜粋
if (stackPos ≦ stackの要素数)
stack[a] ← inputData
stackPos ← stackPos + 1
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
stackPos の定義が「次に値を格納する位置」でした。push がやりたいのはまさにそこへ格納することなので、そのまま使えます。書いたあとの stackPos ← stackPos + 1 が「次に入れる位置を1つ進める」にあたります。
a に入るもの
stack[stackPos] ← inputData
1つ手前(stackPos - 1)に書くと、どうなるか。空いている枡ではなく、すでに値が入っている枡に書くことになります。
こちらは誤り ── 1つ手前に書くと、入っていた値が消える
※ 網掛け=未定義。取り消し線=この操作で消える値。
初期状態で push(9) を stack[stackPos - 1](=2番)へ書いた場合
書く前
stack
14
23
3未定義
4未定義
9 を書く
書いたあと
stack
14
29
3未定義
4未定義
stackPos3 → 4
2番に入っていた 3 が消えました。書いたあと stackPos は 4 へ進むので、3番は空のまま飛ばされます ── このあと pop すると、その空の 3番を読むことになります。
書く先は、空いている枡でなければならない ── それが stackPos の指す枡です。
空欄 b ── 読むのは「1つ手前」
stackPos が指しているのはまだ空の枡で、その先もずっと空でした。だから stackPos から先を読んでも 未定義の値しか出てきません。pop が読める枡は、stackPos より手前だけです。
決めるのは、pop のこの行です。
〔プログラム〕pop の抜粋
if (stackPos > 1)
stackPos ← b
popData ← stack[stackPos]
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
先に位置を決めてから、その次の行で stack[stackPos] を読みます。つまり b の式が読む場所そのものです。手前でいちばん近いのは 1つ手前なので、1 を引きます。
b で決めた位置が、そのまま読む場所になる
※ ▲=stackPos が指している枡。網掛け=未定義。
push(9) のあと(stackPos は 4)
決める前
stack
14
23
39
4未定義▲
1 を引く
決めたあと
stack
14
23
39▲
4未定義
次の行 popData ← stack[stackPos] が読むのは、いま決めた 3番。中身は 9 ── 直前に push した値です。
4 から 3 にするには 1 を引く。
b に入るもの
stackPos ← stackPos - 1
本番の手順 ── 「配列+位置の変数」が出たら
- その変数が何を指しているかを、問題文から1文で拾う。「次に入れる位置」なのか「最後に入れた位置」なのか。ここが決まれば残りは全部決まります。
- 初期状態の図で、指している枡が空かどうかを見る。空を指していれば「次に入れる位置」、値を指していれば「最後に入れた位置」。1文の読みちがいが、その場で分かります。
- 書き込みと位置の更新が、どちらが先かを見る。先に位置を動かすなら、その式が読む場所そのものになります。
ここで初めて解答群を見る
書いた式は a が stackPos、b が stackPos - 1。解答群でこの組合せは イ ひとつだけです。
答え合わせ ── 入れて動かすと、最後に入れた値が返る
空欄に イ を入れて、初期状態から push(9) → pop() と動かします。見るのは stack と stackPos、そして pop が返す値です。
1行ずつ追う 正解の イ(push(9) → pop())
出典:令和7年度 科目B 公開問題 問3(空欄に イ を入れたもの)
ループ開始前
配列 stack
いま計算していること
変数の状態
return で返す値
トレース表(進めると1行ずつ積み上がります)
正解は イ
a は stackPos、b は stackPos - 1。pop() は最後に入れた 9 を返し、スタックは初期状態に戻りました。
ほかの3つは、ア・ウ(b が stackPos + 1)が空きの側を読みます ── 初期状態で pop() すると、値ではなく未定義の値が返ります。エ(a が stackPos - 1)は push(9) が 2番の 3 を上書きしてしまいます。
同じ考え方で解く練習問題
位置の変数が何を指しているかを読み直すのが手順でした。次は、その変数が指すものが本問と違う形です。
当サイトで作った類題です(IPAの出題ではありません)
次の push2 は、配列 stack(要素数 4)と変数 topPos でスタックを表します。topPos は「最後に値を入れた位置」を示します(本問の stackPos とは指すものが違います)。初期状態は stack = {4, 3, 未定義の値, 未定義の値}、topPos = 2 です。空欄に入れる正しい答えはどれですか。
○論理型: push2(整数型: inputData)
if (topPos < stackの要素数)
stack[[ ]] ← inputData
topPos ← topPos + 1
return true
else
return false
endif
「配列+位置の変数」の問題を見分ける
配列と、位置を表す変数が1つセットで出てきたら、この形です。スタック・キュー・待ち行列と名前は変わりますが、読むところは同じ ── その変数が何を指しているかの1文だけです。読み方は、上の「本番の手順」の3つで足ります。
この問題の解答群は4つとも「stackPos か、その ±1」でした。1つずれるかどうかしか違わないので、見比べても決まりません。定義の1文に戻るのが、いちばん速い道です。
次に読む
stack[stackPos] が読めなかった人へG10大域 ── 関数の外に置いた変数がどこから見えるか一覧公開されている科目B の解説 ── 続けて解きたい人へこの記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
「topPos が最後に入れた位置を指す練習問題」は当サイトのオリジナルです。

