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

選択肢
ア: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)です。
解法ステップ
-
スタックの性質を理解する
- スタックは「積む(push)」と「取り出す(pop)」の2操作で、最後に積んだものが最初に取り出されます(LIFO。皿を積んだイメージで、上の皿から取ると考えると分かりやすいです)。
-
入力 X → Y → Z を順に処理し、出力希望順を実現できるか試行する
- 各入力に対し「①そのまま出力」「②スタックへ積む」のどちらかを選べます。いつでもスタックの上から「③取り出して出力」できます。
- 疑わしい順番(ここでは Z, X, Y)について、全ての操作パターンを試すか、スタックの順序制約から不可能を論理的に示します。
-
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。
よくある誤解
-
「スタックに積めば自由に順序を作れる」
- スタックは順序を反転する道具ですが、すべての並べ替えが可能なわけではありません。LIFO の制約で特定の順序は不可能です。
-
「Z を先に出せば、残りは自由にできる」
- Z を先にした後の X と Y の順は、既に積まれているかどうかで決まり、積まれていれば Y→X の順になります。状況により制約が残ります。
補足コラム
- この問題は「スタックで生成できる順列(stack permutations)」の典型です。一般に入力 1..n に対して単一スタックで可能な出力順は限られ、数学的には特定のパターンを避ける(pattern-avoiding)順列になります。実務的にはコンパイラの括弧検査や、Undo(取り消し)機能の内部動作イメージに近い考え方です。
- 例え話:お皿を積むとき、最後に積んだお皿を最初に取り出すので、途中で「一つ下のお皿だけ先に取り出す」ことはできません。
FAQ
Q1. 入力の順序が逆(Z, Y, X)ならどうなる?
A1. 入力順が変われば可能な出力も変わります。問題と同様に操作をシミュレーションすれば判定できます。
A1. 入力順が変われば可能な出力も変わります。問題と同様に操作をシミュレーションすれば判定できます。
Q2. 複数のスタックがあれば全部の順序が作れる?
A2. 複数のスタックを使うと可能な順列は増えます。特に複数の並列構造を組み合わせると、ほとんどの並べ替えが可能になりますが、設計によります。
A2. 複数のスタックを使うと可能な順列は増えます。特に複数の並列構造を組み合わせると、ほとんどの並べ替えが可能になりますが、設計によります。
Q3. 素早く判定するコツは?
A3. 目安は「ある要素 A を出力する前に、後から来る要素 B がスタックに入っていると、B は A より先に出る」というルールを使って矛盾を探すことです。小さな数(3つ)なら実際に操作列を試すのが早いです。
A3. 目安は「ある要素 A を出力する前に、後から来る要素 B がスタックに入っていると、B は A より先に出る」というルールを使って矛盾を探すことです。小さな数(3つ)なら実際に操作列を試すのが早いです。
関連キーワード: スタック、LIFO、積み上げ、データ構造、順序入れ替え、操作シミュレーション

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

