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

選択肢
ア: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を組み合わせることで期待順序が得られます。
解法ステップ
- 状態確認:S1 = [a(top), b, c, d], S2 = [] とする(上がトップ)。
- 目標は出力列b, c, d, a。まずbをS2のトップにする必要がある。
- 操作列 f,f,g,f,g,f,g,g を順に適用して検証する(下に詳細に示す)。
- 初期:S1 = [a, b, c, d], S2 = [], 出力 = []
- f → aを移動:S1=[b,c,d], S2=[a], 出力=[]
- f → bを移動:S1=[c,d], S2=[b,a], 出力=[]
- g → S2からbを出力:S1=[c,d], S2=[a], 出力=[b]
- f → cを移動:S1=[d], S2=[c,a], 出力=[b]
- g → cを出力:S1=[d], S2=[a], 出力=[b,c]
- f → dを移動:S1=[], S2=[d,a], 出力=[b,c]
- g → dを出力:S1=[], S2=[a], 出力=[b,c,d]
- 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と配置されています。
A: はい。本問では上端がスタックのトップと解釈します。問題文の図は上からa, b, c, dと配置されています。
Q: fは何をする操作ですか?
A: fはS1からポップした要素をそのままS2にプッシュ(S2のトップへ積む)する操作です。
A: fはS1からポップした要素をそのままS2にプッシュ(S2のトップへ積む)する操作です。
Q: gはどのスタックから出力しますか?
A: gは常にS2のトップをポップして出力します。S1から直接出力はしません。
A: gは常にS2のトップをポップして出力します。S1から直接出力はしません。
Q: どのようにして正しい順序を設計すれば良いですか?
A: 目標出力の先頭要素がS2のトップになるように、必要な要素だけS1からS2に移してからgを入れることを繰り返します。
A: 目標出力の先頭要素がS2のトップになるように、必要な要素だけS1からS2に移してからgを入れることを繰り返します。
関連キーワード: スタック、LIFO、push、pop、スタック操作、スタックパーミュテーション、操作順序、アルゴリズム理解

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

