戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2011年 秋期 午前(科目A) 問05


問題文

スタック1, 2があり、図の状態になっている。関数fはスタック1からポップしたデータをそのままスタック2にプッシュする。関数gはスタック2からポップしたデータを出力する。b, c, d, aの順番に出力するためには、関数をどの順で実行すればよいか。
基本情報技術者 2011年 秋期 午前(科目A) 問05の問題画像

選択肢

ア:f,f,g,f,f,g,g,g
イ:f,f,g,f,g,f,g,g(正解)
ウ:f,f,g,f,g,g,f,g
エ:f,f,g,g,f,f,g,g

🔒 解説は解答すると表示されます

スタック操作順序【午前解説】

正解の理由

選択肢 イ はfとgの順でS1→S2というLIFOの転送とS2からの出力を交互に行い、最終的にb, c, d, aの順に出力します。初期のS1は上からa, b, c, d(aがトップ)であり、fを2回でa,bをS2に積み、gでbを先に出力することでbが最初に出ます。以降も同様に必要なタイミングでfとgを組み合わせることで期待順序が得られます。

解法ステップ

  1. 状態確認:S1 = [a(top), b, c, d], S2 = [] とする(上がトップ)。
  2. 目標は出力列b, c, d, a。まずbをS2のトップにする必要がある。
  3. 操作列 f,f,g,f,g,f,g,g を順に適用して検証する(下に詳細に示す)。
  • 初期:S1 = [a, b, c, d], S2 = [], 出力 = []
  1. f → aを移動:S1=[b,c,d], S2=[a], 出力=[]
  2. f → bを移動:S1=[c,d], S2=[b,a], 出力=[]
  3. g → S2からbを出力:S1=[c,d], S2=[a], 出力=[b]
  4. f → cを移動:S1=[d], S2=[c,a], 出力=[b]
  5. g → cを出力:S1=[d], S2=[a], 出力=[b,c]
  6. f → dを移動:S1=[], S2=[d,a], 出力=[b,c]
  7. g → dを出力:S1=[], S2=[a], 出力=[b,c,d]
  8. g → aを出力:S1=[], S2=[], 出力=[b,c,d,a]

選択肢別の誤答解説

  • ア: f,f,g,f,f,g,g,g
    2回目以降にfを続けてS2に多く積むため、出力はb, d, ... のように順序が崩れます(4〜6手目で期待順と異なる)。
  • イ: f,f,g,f,g,f,g,g
    正解。上節の通り、各ステップでS2のトップが期待する出力になるようgを挿入しています。
  • ウ: f,f,g,f,g,g,f,g
    5〜6手目でgを連続してaを早く出力してしまい、3番目にaが出るため順序がb,c,a,… になって誤りです。
  • エ: f,f,g,g,f,f,g,g
    3〜4手目でgを連続してaを早く出力してしまい、bの次にaが出るので誤りです。

よくある誤解

  • 「上の要素がaでなくdがトップだ」と誤認すると操作順序の判断を誤り、出力順が狂います。図の上端がトップと解釈する点を確認してください。
  • 「fをまとめて多く実行すれば良い」と考えるとS2に余計な反転が生じ、出力順を崩します。必要な時にgを挟むのが肝心です。
  • gがS1から出力すると誤解するケース:gは常にS2からしか出力しない点を忘れないでください。

補足コラム

  • この問題は「スタック(LIFO)」の基本理解と、複数スタックを使った順序制御の練習問題です。S1→S2の単純な転送は順序を反転させ、途中で出力(g)を挟むことで部分的に反転を解除できます。
  • 一般に「二つのスタックを直列に使う」操作は、順序の全体的な変換(スタックパーミュテーション)を生み、出力可能な順列は制約を受けます。試験対策では図示されたトップ・ボトムの確認をまず行ってください。

FAQ

Q: トップは図の上側で確定ですか?
A: はい。本問では上端がスタックのトップと解釈します。問題文の図は上からa, b, c, dと配置されています。
Q: fは何をする操作ですか?
A: fはS1からポップした要素をそのままS2にプッシュ(S2のトップへ積む)する操作です。
Q: gはどのスタックから出力しますか?
A: gは常にS2のトップをポップして出力します。S1から直接出力はしません。
Q: どのようにして正しい順序を設計すれば良いですか?
A: 目標出力の先頭要素がS2のトップになるように、必要な要素だけS1からS2に移してからgを入れることを繰り返します。

関連キーワード: スタック、LIFO、push、pop、スタック操作、スタックパーミュテーション、操作順序、アルゴリズム理解
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者を
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について