アルゴリズムとプログラミング

基本情報技術者試験スタック・キュー」の問題

アルゴリズムとプログラミングアルゴリズムとプログラミング計算問題難易度:hard
容量 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 の増減を取り違えるミスが多い。

アルゴリズムとプログラミングの他の問題

この問題を、AIの8-ways解説つきで。

基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。

無料ではじめる →

ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0107

【基本情報技術者試験】スタック・キューの問題 — 解答・解説|ukamiru 過去問