平成26年度 春期 午前 問7
データ構造
キューに関する問題
空の状態のキューとスタックの二つのデータ構造がある。次の手続を順に実行した場合,変数 x に代入されるデータはどれか。ここで,手続で引用している関数は,次のとおりとする。
〔関数の定義〕
push(y):データ y をスタックに積む。 pop() :データをスタックから取り出して,その値を返す。 enq(y) :データ y をキューに挿入する。 deq() :データをキューから取り出して,その値を返す。
〔手続〕
push(a) push(b) enq(pop()) enq(c) push(d) push(deq()) x ← pop()
- アa
- イb
- ウc
- エd
答えと解説を見る
✓ これが正解イb
解説
キューを経由した値が最後に積まれます。
入れ物が二つ出てくる手続は、頭の中で追わずに表を書いて一行ずつ埋めるのが確実です。二つのデータ構造の性質を先に押さえます。スタックは後から積んだものが先に出る入れ物で、キューは先に入れたものが先に出る入れ物です。関数が入れ子になっている行は内側から処理します。手続をたどると、まず二つの値がスタックに積まれ、次の行でスタックの上にある値が取り出されてキューへ回されます。続いて別の値がキューに入り、さらに別の値がスタックに積まれます。ここで効くのが、キューから取り出してスタックへ積み直す行です。キューの先頭にいるのは最初に回された値なので、それがスタックのいちばん上に戻ってきます。最後の取り出しで変数に入るのはこの値です。二つの入れ物を往復した値が答えになる、というのがこの問の芯です。
ほかの選択肢はなぜ違うのか
- アa:いちばん最初に積まれた値で、その後は一度も取り出されずスタックの底に残り続けます。上に別の値が乗っている間は取り出しの対象にならないので、変数には入りません。
- ウc:途中でキューに入れられた値ですが、その前に入っていた値が先に取り出される決まりなので、最後までキューに残ります。スタックへ移る機会がなく、変数にも届きません。
- エd:最後に積んだ値だと早合点すると選びたくなります。しかしその後にもう一行だけ積む操作が続いているので、いちばん上に乗っているのは後から積み直された別の値です。
出典:平成26年度 春期 基本情報技術者試験 午前 問7
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)