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

ITパスポート 2010年 春期 問85


問題文

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

選択肢

ア:X, Z, Y
イ:Y, Z, X
ウ:Z, X, Y(正解)
エ:Z, Y, X

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

スタックによる順序変換【ITパスポート解説】

正解の理由

この装置は「スタック(最後に入れたものが最初に出る、LIFO = Last In First Outの箱)」を使います。右側から順にX, Y, Zを入力するとき、スタックに積むとXの上にY、さらに上にZが乗る形になります。スタックの性質上、同時に積んだXとYは「後から入れたYが先に出る」ため、Zを先に出してからXを先に、Yを後に出す(順序Z, X, Y)ような出力は作れません。したがって、出力できない順番は ウ(Z, X, Y)です。

解法ステップ

  1. スタックの性質を理解する
    • スタックは「積む(push)」と「取り出す(pop)」の2操作で、最後に積んだものが最初に取り出されます(LIFO。皿を積んだイメージで、上の皿から取ると考えると分かりやすいです)。
  2. 入力X → Y → Zを順に処理し、出力希望順を実現できるか試行する
    • 各入力に対し「①そのまま出力」「②スタックへ積む」のどちらかを選べます。いつでもスタックの上から「③取り出して出力」できます。
    • 疑わしい順番(ここではZ, X, Y)について、全ての操作パターンを試すか、スタックの順序制約から不可能を論理的に示します。
  3. Z, X, Yが不可能である論理的証明(簡潔な方法)
    • Zを先に出すには、Z到着時に ①(そのまま出力)を選ぶか、すべてを積んで後で取り出す手しかありません。
    • XとYのどちらかをスタックに入れている場合、Xは先に入力されているのでYが上に来ます。よって、Zより後にXとYを出すにはスタックから先にYが出てXが出ます(出力順はY, X)。これではXの先出(X→Y)はできません。
    • 結論:Zを先に出し、その後Xを先に、Yを後に出す(Z, X, Y)は実現できない。

選択肢別の誤答解説

  • ア: X, Z, Y
    • 可能です。操作例:Xを①で出力(X)、Yを②でスタックに積む、Zを①で出力(Z)、最後にスタックを③で取り出す(Y)。出力列はX, Z, Y。
  • イ: Y, Z, X
    • 可能です。操作例:Xを②で積む、Yを①で出力(Y)、Zを①で出力(Z)、最後にスタックを③で取り出す(X)。出力列はY, Z, X。
  • ウ: Z, X, Y
    • 不可能です(前節の通り)。Zを先に出し、その後XをYより先に出すには、YをXの下にしておかなければなりません。しかしXは先に入るため、Yが上になり、PopするとYが先に出てしまいます。したがってZ, X, Yの順は作れません。
  • エ: Z, Y, X
    • 可能です。操作例:Xを②で積む、Yを②で積む(スタック上は下からX → Y)、Zを①で出力(Z)、その後スタックを③で2回取り出してY, Xと出力。出力列はZ, Y, X。

よくある誤解

  1. 「スタックに積めば自由に順序を作れる」
    • スタックは順序を反転する道具ですが、すべての並べ替えが可能なわけではありません。LIFOの制約で特定の順序は不可能です。
  2. 「Zを先に出せば、残りは自由にできる」
    • Zを先にした後のXとYの順は、既に積まれているかどうかで決まり、積まれていればY→Xの順になります。状況により制約が残ります。

補足コラム

  • この問題は「スタックで生成できる順列(stack permutations)」の典型です。一般に入力1..nに対して単一スタックで可能な出力順は限られ、数学的には特定のパターンを避ける(pattern-avoiding)順列になります。実務的にはコンパイラの括弧検査や、Undo(取り消し)機能の内部動作イメージに近い考え方です。
  • 例え話:お皿を積むとき、最後に積んだお皿を最初に取り出すので、途中で「一つ下のお皿だけ先に取り出す」ことはできません。

FAQ

Q1. 入力の順序が逆(Z, Y, X)ならどうなる?
A1. 入力順が変われば可能な出力も変わります。問題と同様に操作をシミュレーションすれば判定できます。
Q2. 複数のスタックがあれば全部の順序が作れる?
A2. 複数のスタックを使うと可能な順列は増えます。特に複数の並列構造を組み合わせると、ほとんどの並べ替えが可能になりますが、設計によります。
Q3. 素早く判定するコツは?
A3. 目安は「ある要素Aを出力する前に、後から来る要素Bがスタックに入っていると、BはAより先に出る」というルールを使って矛盾を探すことです。小さな数(3つ)なら実際に操作列を試すのが早いです。

関連キーワード: スタック、LIFO、積み上げ、データ構造、順序入れ替え、操作シミュレーション
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

ITパスポートを
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

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

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