平成23年度 秋期 午前 問5
データ構造
スタックに関する問題
スタック1,2があり,図の状態になっている。関数 f はスタック1からポップしたデータをそのままスタック2にプッシュする。関数 g はスタック2からポップしたデータを出力する。b,c,d,a の順番に出力するためには,関数をどの順で実行すればよいか。
〔図〕 スタック1 スタック2 ┌─────┐ ┌ ─ ─ ─ ┐ │ (空き)│ ┊ (空き)┊ ├─────┤ ├ ─ ─ ─ ┤ │ a │ ← 上端 ┊ ┊ ├─────┤ ├ ─ ─ ─ ┤ │ b │ ┊ ┊ ├─────┤ ├ ─ ─ ─ ┤ │ c │ ┊ ┊ ├─────┤ └ ─ ─ ─ ┘ │ d │ └─────┘ (スタック2は空・仕切りは点線)
- アf, f, g, f, f, g, g, g
- イf, f, g, f, g, f, g, g
- ウf, f, g, f, g, g, f, g
- エf, f, g, g, f, f, g, g
答えと解説を見る
✓ これが正解イf, f, g, f, g, f, g, g
解説
先に二つ移し、あとは移すことと出すことを交互にします。
スタックは最後に入れたものが先に出る入れ物です。一方の関数は片方からポップした値をもう一方へプッシュし、他方の関数は積まれた側からポップして出力します。求められている出力の並びは、もとの並びの二番目から順に下へ進み、最後に先頭の値が来る形です。ですから先頭の値は早いうちに移してしまい、出力せずに底へ沈めておく必要があります。移す関数を続けて二回実行すると、先頭の値が下、二番目の値が上に積み上がります。ここで出す関数を一回実行すれば、二番目の値が出ます。あとは、次の値を一つ移してはすぐ出す、という組合せを繰り返せば、もとの並びの順に取り出せます。最後に底へ沈めておいた先頭の値だけが残るので、それを出して終わりです。判定の軸は、出す操作をはさむ間隔が、底へ沈めた値を途中で掘り出さない形になっているかどうかです。
ほかの選択肢はなぜ違うのか
- アf, f, g, f, f, g, g,…:はじめに二回移して一回出したあと、移す操作をさらに二回続けています。二つ積んだ状態から上の値を先に出すことになるので、二番目と三番目に出る値の順が入れ替わります。
- ウf, f, g, f, g, g, f,…:途中で出す操作を二回続けている箇所があり、そこで底へ沈めておいた先頭の値を掘り出してしまいます。そのため先頭の値が三番目に出て、最後に来るはずの値と順が入れ替わります。
- エf, f, g, g, f, f, g,…:はじめに二回移したあと、出す操作を二回続けています。そこで先頭の値が二番目に出てしまい、さらに残りの二つをまとめて積んでから出すので、その二つの順も入れ替わります。
出典:平成23年度 秋期 基本情報技術者試験 午前 問5(改変:原典の図表をテキストに書き起こした)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)