ITパスポート 2016年 秋期 問92
問題文
後に入れたデータが先に取り出されるデータ構造(以下、スタックという)がある。これを用いて、図に示すような、右側から入力されたデータの順番を変化させて、左側に出力する装置を考える。この装置に対する操作は次の3通りである。
① 右側から入力されたデータをそのまま左側に出力する。
② 右側から入力されたデータをスタックの1番上に積み上げる。
③ スタックの1番上にあるデータを取り出して左側に出力する。
この装置の右側から順番にデータA, B, C, Dを入力した場合に、この①~③の操作を組み合わせても、左側に出力できない順番はどれか。

選択肢
ア:B, A, D, C
イ:B, D, C, A
ウ:C, B, D, A
エ:C, D, A, B(正解)
🔒 解説は解答すると表示されます
スタックによる出力順の判定【ITパスポート 解説】
正解の理由
スタック(データを積み重ね、最後に入れたものを先に取り出す仕組み。LIFO:Last In, First Out)を使うと、入力 A, B, C, D(この順に右から入る)から得られる出力は「スタックの挙動(最後に積んだものが先に出る)」に従います。選択肢のうち、出力順が C, D, A, B(選択肢 エ)は、A と B を C より後で出すために A と B を先にスタックに積む必要があります。しかしそのときスタックの取り出し順は B が先、A が後になります(LIFO)。したがって左側に A を B より先に出すことはできず、C, D, A, B は実現不可能です。よって正解は選択肢 エ が「出力できない順番」です。
解法ステップ
- スタックの性質を確認する。
- スタック:最後に入れた(push)ものが最初に出る(pop)構造。英語で LIFO(Last In, First Out)。
- 問題の操作:① 直接出力(パスする)、② スタックに積む(push)、③ スタックから取り出す(pop)。
- 出力の先頭(最初に左から出したいデータ)を見る。
- そのデータより前に入っている要素がある場合、それらをどう扱うか考える(出すなら先に出す/残すならスタックに積む)。
- スタックに残した要素は逆順でしか出せないことを使う。
- 「あるとき点でスタックに乗っている複数要素の相対順序は逆転する」点が重要。
- 各選択肢について、上のルールで矛盾が生じるかどうかを検証する。
- 矛盾が起きれば「出力できない」。
選択肢別の誤答解説
-
ア: B, A, D, C
実現可能です。操作例:- A 到着:②(A を積む)
- B 到着:①(B を直接出力) ← 出力順 1:B
- ③(スタックから A を取り出す) ← 出力順 2:A
- C 到着:②(C を積む)
- D 到着:①(D を直接出力) ← 出力順 3:D
- ③(C を取り出す) ← 出力順 4:C
-
イ: B, D, C, A
実現可能です。操作例:- A 到着:②(A を積む)
- B 到着:①(B を直接出力) ← 1:B
- C 到着:②(C を積む) // C は D の後に出したいので積む
- D 到着:①(D を直接出力) ← 2:D
- ③(C を取り出す) ← 3:C
- ③(A を取り出す) ← 4:A
-
ウ: C, B, D, A
実現可能です。操作例:- A 到着:②(A を積む)
- B 到着:②(B を積む) // Aの下にBが来る(Bがトップ)
- C 到着:①(C を直接出力) ← 1:C
- ③(B を取り出す) ← 2:B
- D 到着:①(D を直接出力) ← 3:D
- ③(A を取り出す) ← 4:A
-
エ: C, D, A, B
実現不可能な理由(上で述べた具体的帰結):- C を最初に出すためには A, B を C が来る前にスタックに積んでおく必要がある(A, B を出してしまうと C が先に出せないため)。
- 積んだ順は A(底)→ B(上)になるので、後で取り出すときは B が先、A が後。つまりスタックから出す順は B, A になる。
- しかし要求されているのは A が B の前に出ること(…A, B)。スタックの性質と矛盾し、実現できません。
よくある誤解
- 「スタックに入れておけば順序は自由に並べ替えられる」
- 誤りです。スタックは逆順にしか取り出せません。積む順序がそのまま出す順を制限します。
- 「直接出力(①)できるならスタックの中身は関係ない」
- 直接出力は可能ですが、一度スタックに積んだ要素の相対順序は変えられません。直接出力で後続を先に出す判断ができても、スタックの既存要素の順序は影響を受けます。
補足コラム
- 単一のスタックで作れる出力順は「スタック順列(stack permutation)」と呼ばれます。直感的には「ある要素を後で出したいなら、それより前の要素は一旦スタックに退避させる必要がある」。でも退避した複数要素は逆順でしか戻せない、これが制約です。
- 用語メモ:
- push(プッシュ):データをスタックに積む操作(本問題の②)。
- pop(ポップ):スタックからデータを取り出す操作(本問題の③)。
- LIFO(Last In, First Out):最後に入れたものを最初に取り出す性質。
FAQ
Q1. 見分けるコツは?
A1. 「出力したい先頭要素より前に入っている要素がある場合、それらを全てスタックに積む必要があるか」を考えます。積むなら、後でそのグループは逆順でしか出せない点に着目します。
A1. 「出力したい先頭要素より前に入っている要素がある場合、それらを全てスタックに積む必要があるか」を考えます。積むなら、後でそのグループは逆順でしか出せない点に着目します。
Q2. 複数のスタックがあればどうなる?
A2. スタックが2つ以上あると、可能な出力は増えます。1つのスタックに比べて逆順制約が緩和されますが、今回の問題は単一スタックに限定されています。
A2. スタックが2つ以上あると、可能な出力は増えます。1つのスタックに比べて逆順制約が緩和されますが、今回の問題は単一スタックに限定されています。
Q3. 直感的に「C, D, A, B」がダメな理由を簡潔に教えてください。
A3. C を最初に出すため A, B をスタックに退避させると、退避した順は B が先、A が後で戻るため、A を B の前に出せないからです。
A3. C を最初に出すため A, B をスタックに退避させると、退避した順は B が先、A が後で戻るため、A を B の前に出せないからです。
関連キーワード: スタック、LIFO(Last In, First Out)、push、pop、データ構造、順列、スタック順列

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

