基本情報技術者試験「スタック・キュー」の問題
容量 4 の循環キュー(リングバッファ)を配列 buf[1..4] で実装する。head は次に取り出す位置、tail は次に入れる位置で、初期は head=1, tail=1, 個数 cnt=0。enq は buf[tail] に格納し tail を 1 進め(4 の次は 1 に戻る)cnt を +1、deq は buf[head] を返し head を 1 進め cnt を −1 する。空の状態から次を実行したあとの (head, tail, cnt) の組はどれか。
○手続: run() enq(11) enq(22) enq(33) deq() enq(44) enq(55) deq()
ア(head,tail,cnt)=(2,1,4)
イ(head, tail, cnt) = (1, 2, 3)(巡回未反映)
ウ(head, tail, cnt) = (3, 2, 3)
エ(head, tail, cnt) = (3, 1, 2)
正解
ウ.(head, tail, cnt) = (3, 2, 3)
enq で tail が進み、deq で head が進む。いずれも 4 の次は 1 に戻る。操作を順に追うと head=3、tail=2、cnt=3 に到達するため ウが正しい。
?選択肢ごとの解説
ア ×deq を 1 回しか反映せず cnt を 4 のままにし、head・tail も 1 つずつずらした誤りである。
イ ×巡回(4 の次が 1)を反映せず head・tail を初期付近に留めた、ラップアラウンドの見落としである。
ウ ○enq で tail が進み、deq で head が進む。いずれも 4 の次は 1 に戻る。操作を順に追うと head=3、tail=2、cnt=3 に到達するため ウが正しい。
エ ×cnt の増減を取り違え、enq と deq の回数差を 2 と誤って cnt=2 とした計数の誤りである。
✎くわしく
循環キューでは head と tail が配列末尾を超えると先頭へ巻き戻る(巡回する)。cnt は enq で +1、deq で −1 され、満杯・空の判定に使う。ポインタの巡回と cnt の同期が核心である。
✓本番での押さえどころ
試験のコツ
head, tail, cnt の 3 値を 1 操作ごとに更新し、ポインタが 4 を超えたら 1 へ戻すことを必ず確認する。
覚え方
『末尾の次は先頭=リング状』と巡回を覚え、cnt は入れたら増え出したら減る。
よくある誤り
tail が 4 の次に 5 へ進むと誤り巻き戻しを忘れる、または cnt の増減を取り違えるミスが多い。
アルゴリズムとプログラミングの他の問題
次の擬似言語で表される手続 sumOdd を、引数として要素数 5 の整数型の配列 {12, 125, 1008,…次の擬似言語は、整数型の配列 arr に対して隣接交換を行う手続の一部であり、外側ループの 1 回目(1…次の擬似言語は昇順に整列された配列 arr に対する二分探索の手続である。arr = {2, 4, 6, 8, 10,…次の擬似言語で表される再帰手続 f を、引数 n = 20 で呼び出したとき、戻り値として返される値はどれか。
```…単方向連結リストの各ノードはメンバ val(整数)と next(次ノードへの参照。なければ NULL)をもつ。先頭ノード…スタックに対する push(積む)と…
この問題を、AIの8-ways解説つきで。
無料ではじめる →基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。
ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0107