空の状態のキューとスタックの二つのデータ構造がある。
次の手続を順に実行した場合,変数xに代入されるデータはどれか。
ここで,手続で引用している関数は,次のとおりとする。
〔関数の定義〕
push(y):データyをスタックに積む。
pop():データをスタックから取り出して,その値を返す。
enq(y):データ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)の構造です。
【計算】
push(a)、push(b)で、スタックは下からa、bの順になります。
enq(pop())でスタックの最上段bを取り出し、キューに入れます。
enq(c)で、キューは先頭からb、cの順になります。
push(d)で、スタックは下からa、dの順になります。
push(deq())でキュー先頭のbを取り出してスタックに積み、スタックは下からa、d、bになります。
x ← pop()で最上段のbが取り出され、xにはbが入ります。
【選択肢別解説】
1:× aはスタックの最下段に残ったままで、取り出されません。
2:○ 最後のpop()で取り出されるのは、直前にキューから移したbです。
3:× cはキューに入った後、b を取り出した時点でもキューに残っています。
スタックには積まれていません。
4:× dはスタックに積まれていますが、その上にbが積まれたため、最後のpop()では取り出されません。
【ポイント】
スタックとキューの問題は、各操作の後に中身を書き出すと間違えません。
スタックは関数呼出しの管理、キューは待ち行列の管理に使われます。