応用情報技術者 2012年 春期 午前2 問06
問題文
A,B,Cの順序で入力されるデータがある。各データについてスタックへの挿入と取出しを1回ずつ行うことができる場合、データの出力順序は何通りあるか。

選択肢
ア:3
イ:4
ウ:5(正解)
エ:6
🔒 解説は解答すると表示されます
スタックの出力順序【午前2解説】
正解の理由
入力順が A, B, C で、各データをスタックに「挿入(push)」と「取出し(pop)」をそれぞれ1回だけ行えるとき、スタックの LIFO(後入れ先出し)制約のもとで得られる出力順序は 5 通りになります。これは選択肢のうち ウ の「5」が成立するためです。
具体的には、スタック操作で実現できる順序は次の5つです:ABC、ACB、BAC、BCA、CBA。逆に CAB は不可能です(C を先に取り出した後、A を B より先に取り出すことはスタックの性質上できません)。したがって総数は 5 です。
解法ステップ
- スタックは LIFO(後入れ先出し)であることを確認する。
- 入力順 A → B → C に対し、各要素を push するか pop するかの操作列で到達可能な出力列を列挙する。
- 列挙による確認、または一般式(カタラン数)で個数を求める。n 個の場合の個数はカタラン数 であり、ここで より
例として、各出力順に対する一連の操作(push/pop)の一例を示します。
- ABC: push A, pop A → A; push B, pop B → B; push C, pop C → C
- ACB: push A, pop A → A; push B, push C, pop C → C, pop B → B
- BAC: push A, push B, pop B → B, pop A → A; push C, pop C → C
- BCA: push A, push B, pop B → B; push C, pop C → C; pop A → A
- CBA: push A, push B, push C, pop C → C, pop B → B, pop A → A
これらはすべてスタック操作で実現可能で、CAB の実現は不可能です(詳しくは次節)。
選択肢別の誤答解説
- ア: 3
スタックで可能な順序は 3 より多く、列挙すれば 5 通り存在するため過小評価です。 - イ: 4
4 とするのは一つを見落としているケースです。実際はもう1通り(例えば BCA や BAC のどちらか)を含めると 5 になります。 - ウ: 5(正解)
上述の5通り(ABC, ACB, BAC, BCA, CBA)がすべて実現可能で、個数は 5 です。 - エ: 6
6 は全順列の数ですが、スタック制約により順列のうち少なくとも1つ(CAB)が実現不可能なので、総数は 6 にはなりません。
よくある誤解
- 全ての順列が可能だと考える誤り:スタックは LIFO なので、途中で上にある要素を先に取り出さなければならず、例えば CAB のように C を取り出した後に A を B より先に取り出すことはできません。
- 操作手順の説明ミス:列挙する際に push/pop の順序と対応する出力を正しく書かないと、実現可能かどうかを誤判断しやすいです。各出力に対して「どの時点で pop したか」を明示すると誤りが減ります。
補足コラム
スタックによる出力順の個数は、n 個の入力に対してカタラン数で表されます。カタラン数は括弧の対応、二分木、山の形(Dyck パス)など多くの組合せ問題と対応しており、スタック操作の可否判定は「対応する括弧列が正当か」を見るのと同型です。小さい n では列挙が確実ですが、n が大きくなるとカタラン数の式を使うと簡単に個数が求められます。
FAQ
Q: なぜ CAB が不可能なのですか?
A: C を最初に取り出すためには A, B, C を順に push してから C を pop します。その時点でスタックの上に残っているのは B(とその下に A)であり、A を B の上に出す(B より先に pop する)ことはできないため、次に A を出すことはできません。
A: C を最初に取り出すためには A, B, C を順に push してから C を pop します。その時点でスタックの上に残っているのは B(とその下に A)であり、A を B の上に出す(B より先に pop する)ことはできないため、次に A を出すことはできません。
Q: n=4 のときはどう数えるのですか?
A: n=4 のときはカタラン数 です。列挙ではなく公式や再帰 を用いるのが実務的です。
A: n=4 のときはカタラン数 です。列挙ではなく公式や再帰 を用いるのが実務的です。
Q: 判定問題として「ある順列がスタックで出力可能か」をどう判定しますか?
A: 入力を順にスタックに push しつつ、出力列の先頭と比較して一致するなら pop するという貪欲シミュレーションで判定できます。シミュレーションが最後まで矛盾なく進めば可能です。
A: 入力を順にスタックに push しつつ、出力列の先頭と比較して一致するなら pop するという貪欲シミュレーションで判定できます。シミュレーションが最後まで矛盾なく進めば可能です。
関連キーワード: スタック、LIFO、push、pop、スタック順列、カタラン数、Dyck経路、順序列挙

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

