戦国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 情報処理技術者試験対策アプリ

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