応用情報技術者 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経路、順序列挙

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

