優先度付きキューの操作

■ 解き方の方針 優先度1が最も高く、同じ優先度では先に追加された要素から取り出されます。enqueueとdequeueのたびに、残っている要素を優先度別の追加順で管理します。 ■ 出力前までの操作 操作 取り出した要素 操作後のキュー(優先度順) A1, B2, C2, D3 を追加 A(1), B(2), C(2), D(3) dequeue ×2 A, B C(2), D(3) D3, B2 を追加 C(2), B(2), D(3), D(3) dequeue ×2 C, B D(3), D(3) C2, A1 を追加 A(1), C(2), D(3), D(3) while で全部 dequeue A, C, D, D を出力 空 同じ優先度の中では 先に追加した要素が前 に並びます(3行目の C(2) と B(2) の順)。 ■ whileでの出力順 優先度の高い順に全要素をdequeueするため、 A, C, D, D の順に出力されます。二つのDは同じ文字列なので、追加順の違いは出力上は見えません。 ■ 正解と誤答の見分け方 したがって、正解は エ です。 最初に追加したAとBは、出力を始める前のdequeueで既に取り除かれています。途中状態と最終出力を混同しないことがポイントです。

次の記述中の  に入れる正しい答えを,解答群の中から選べ。

優先度付きキューを操作するプログラムである。
優先度は整数型の値 1, 2, 3 のいずれかであり、小さい値ほど優先度が高い。 同一優先度の場合は最初に追加された要素から取り出される。
クラス PrioQueue は優先度付きキューを表すクラスである。クラス PrioQueue の説明を図に示す。ここで,優先度は整数型の値 1,2,3 のいずれかであり,小さい値ほど優先度が高いものとする。
 手続 prioSched を呼び出したとき、出力は  の順となる。

コンストラクタ

説明

PrioQueue()

空の優先度付きキューを生成する。

メソッド

戻り値

説明

enqueue(文字列型: s,整数型: prio)

なし

優先度付きキューに,文字列 s を要素として,優先度prioで追加する。

dequeue()

文字列型

優先度付きキューからキュー内で最も優先度の高い要素を取り出して返す。最も優先度の高い要素が複数あるときは,そのうちの最初に追加された要素を一つ取り出して返す。

size()

整数型

優先度付きキューに格納されている要素の個数を返す。

図 クラス PrioQueue の説明


〔プログラム〕
 ○prioSched()
 PrioQueue: prioQueue ← PrioQueue()
 prioQueue.enqueue("A", 1)
 prioQueue.enqueue("B", 2)
 prioQueue.enqueue("C", 2)
 prioQueue.enqueue("D", 3)
 prioQueue.dequeue() /* 戻り値は使用しない */
 prioQueue.dequeue() /* 戻り値は使用しない */
 prioQueue.enqueue("D", 3)
 prioQueue.enqueue("B", 2)
 prioQueue.dequeue() /* 戻り値は使用しない */
 prioQueue.dequeue() /* 戻り値は使用しない */
 prioQueue.enqueue("C", 2)
 prioQueue.enqueue("A", 1)
 while (prioQueue.size() が 0 と等しくない)
  prioQueue.dequeue() の戻り値を出力
 endwhile

出典令和4年度 基本情報技術者試験 科目B サンプル問題 問8
ア
"A", "B", "C", "D"
イ
"A", "B", "D", "D"
ウ
"A", "C", "C", "D"
エ
"A", "C", "D", "D"