基本情報技術者 2018年 春期 午前(科目A) 問05
問題文
次の二つのスタック操作を定義する。
PUSH :スタックにデータ(整数値)をプッシュする。
POP:スタックからデータをポップする。空のスタックに対して、次の順序でスタック操作を行った結果はどれか。
PUSH 1 → PUSH 5 → POP → PUSH 7 → PUSH 6 → PUSH 4 → POP → POP → PUSH 3

選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
スタック操作の実行結果【午前解説】
正解の理由
正解は ウ です。
スタックはLIFO(後入れ先出し)であり、操作を順番に適用すると以下の通りです:PUSH 1 → PUSH 5 → POP(5を除去)→ PUSH 7 → PUSH 6 → PUSH 4 → POP(4を除去)→ POP(6を除去)→ PUSH 3。結果として下(底)から上(頂)へ 1, 7, 3 の順で積まれ、図の上段=頂に3、中段に7、下段に1となるため選択肢ウが一致します。
スタックはLIFO(後入れ先出し)であり、操作を順番に適用すると以下の通りです:PUSH 1 → PUSH 5 → POP(5を除去)→ PUSH 7 → PUSH 6 → PUSH 4 → POP(4を除去)→ POP(6を除去)→ PUSH 3。結果として下(底)から上(頂)へ 1, 7, 3 の順で積まれ、図の上段=頂に3、中段に7、下段に1となるため選択肢ウが一致します。
解法ステップ
- 初期状態:空スタック []
- PUSH 1 → [1](底→頂:1)
- PUSH 5 → [1, 5](頂:5)
- POP → [1](5を除去)
- PUSH 7 → [1, 7]
- PUSH 6 → [1, 7, 6]
- PUSH 4 → [1, 7, 6, 4]
- POP → [1, 7, 6](4を除去)
- POP → [1, 7](6を除去)
- PUSH 3 → [1, 7, 3](最終:底1・中7・頂3)
(図は上段=頂、下段=底の表現に合わせて読むとウが一致します。)
選択肢別の誤答解説
- ア:上段1・中7・下3。これは最終スタック [3,7,1] のように上下を逆に読んでいる誤りで、LIFOの順序追跡を逆転させています。
- イ:上段3・中4・下6。これは途中のPOP処理を正しく反映しておらず、4や6が除去されるべき箇所で残っているため不正解です。
- ウ:上段3・中7・下1。正解。最終的なスタックの頂が3、中が7、底が1の配置と一致します。
- エ:上段6・中4・下3。これはPUSH/POPの適用順を誤って解釈し、最終的に残るべき1が消えている点で誤りです。
よくある誤解
- POPを実行すると「最小値」や「最初に入れた値」が消えると誤認する(実際は最後に入れた値が消える)。
- 図の上下を「上段=底」「下段=頂」と逆に読んでしまい、順序を反転して答えるミス。
- 中間の複数POPをまとめて考え、どの値が残るかを追跡しきれず混乱すること(逐次トレースが必須)。
補足コラム
スタックはプログラムの関数呼び出し履歴(コールスタック)や逆順処理(例:文字列の逆転)などで頻繁に使われます。図で与えられるときは「上段がトップ(頂)」という表現が多いですが、問題によっては逆表記もあり得るため問題文の図や説明を必ず確認してください。試験では操作を一つずつトレースして中間状態をメモする練習が有効です。
簡単なシミュレーション(Python例):
stack = []
ops = [("PUSH",1),("PUSH",5),("POP",None),("PUSH",7),("PUSH",6),
("PUSH",4),("POP",None),("POP",None),("PUSH",3)]
for op,val in ops:
if op == "PUSH":
stack.append(val)
else:
if stack: stack.pop()
print(stack) # 出力: [1, 7, 3] (底→頂)
FAQ
Q1. POPは空のスタックで実行されたらどうなる?
A1. 多くの実装ではエラー(アンダーフロー)になります。問題文に特別な取り扱いがなければ通常はエラーと考えます。
A1. 多くの実装ではエラー(アンダーフロー)になります。問題文に特別な取り扱いがなければ通常はエラーと考えます。
Q2. 図の「上段」が必ずスタックの「頂」か?
A2. 多くはそうですが、問題によって上下の意味が逆の場合があります。文中の説明や慣例(上=頂)を確認してください。
A2. 多くはそうですが、問題によって上下の意味が逆の場合があります。文中の説明や慣例(上=頂)を確認してください。
Q3. 複数のPOPが連続する場合の追跡方法は?
A3. 直近にPUSHされた要素から順に取り除かれるため、操作を一つずつ順に追って残る要素をチェックするのが最も安全です。
A3. 直近にPUSHされた要素から順に取り除かれるため、操作を一つずつ順に追って残る要素をチェックするのが最も安全です。
関連キーワード: スタック、LIFO、PUSH、POP、データ構造、トレース、アルゴリズム、呼び出し履歴、実行時スタック、演習問題

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

