空の状態のキューとスタックの二つのデータ構造がある。
次の手続を順に実行した場合,変数xに代入されるデータはどれか。
ここで,
データyをスタックに挿入することをpush(y),
スタックからデータを取り出すことをpop(),
データyをキューに挿入することをenq(y),
キューからデータを取り出すことをdeq(),
とそれぞれ表す。
push(a)
push(b)
enq(pop())
enq(c)
push(d)
push(deq())
x ← pop()
正答2
解説
正解は2です。
スタックは後入れ先出し(LIFO:Last In First Out)、キューは先入れ先出し(FIFO:First In First Out)のデータ構造です。
手続を1行ずつたどり、各時点の中身を確認します。
【計算】
push(a)のあと、スタックは[a]です。
push(b)のあと、スタックは[a, b]です(右端が先頭)。
enq(pop())では、スタックからbが取り出され、キューは[b]になります。
このときスタックは[a]です。
enq(c)のあと、キューは[b, c]です。
push(d)のあと、スタックは[a, d]です。
push(deq())では、キューの先頭bが取り出され、スタックは[a, d, b]になります。
x ← pop()では、最後に入れたbが取り出されます。
【選択肢別解説】
1:× aはスタックの最も底にあり、最後のpop()では取り出されません。
2:○ 最後にスタックへ積まれたのはキューから移したbなので、xにはbが代入されます。
3:× cはキューに残ったままで、スタックには入っていません。
4:× dはbの下にあるため、最後のpop()ではbが先に取り出されます。
【ポイント】
スタックとキューが混在する問題は、両方の中身を毎行書き出すと確実です。
pop()は最後に入れたもの、deq()は最初に入れたものを取り出します。