プログラミングの基礎(擬似言語のトレース)

要素数4の文字列型の配列 q を環状に使うキューがある。head と tail の初期値は1で、enq(v) は q[tail] ← v の後に tail ← tail mod 4 + 1 を行い、deq() は q[head] の値を返した後に head ← head mod 4 + 1 を行う。次のプログラムを実行したとき、「E」が格納される q の要素はどれか。

enq("A")
enq("B")
enq("C")
deq()
deq()
enq("D")
enq("E")
  1. Aq[1]
  2. Bq[3]
  3. Cq[5]
答えと解説を見る

正解:A. q[1]

mod は + より先に計算するので、tail ← tail mod 4 + 1 は tail を 1 → 2 → 3 → 4 → 1 と循環させます。A、B、C は q[1]〜q[3] に入り、tail = 4 です。2回の deq() で A と B が取り出され、head = 3 になります。D は q[4] に入って tail が 4 mod 4 + 1 = 1 に戻り、E は空いた q[1] に入ります。要素を前へ詰めずに、取り出して空いた場所を再利用するのが環状のキュー(リングバッファ)です。

  • A. 正しい。tail は4の次に1へ戻り、E は取り出し済みで空いた q[1] に入ります。
  • B. 取り出すたびに残りの要素を前へ詰めると考えた場合の位置です。この方式では詰めません。
  • C. tail を4の次に5へ進めた場合の位置で、配列の範囲を超えます。tail mod 4 + 1 で1に戻ります。
この分野を解く 分野ページへ

関連する計算ツール

プログラミングの基礎(擬似言語のトレース)の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

プログラミングの基礎(擬似言語のトレース)のほかの問題

  1. 次のプログラムは、配列 next で要素どうしをつないだ連結リストを、要素番号1の要素から順にたどって出力する。配列の要素番号は1から始まる。next の値0はリストの終わりを表す。出力される値の並びはどれか。
  2. 次のプログラムは、配列 next でつないだ連結リスト A → C → E → D → B の「C」(要素番号3)の直後に、val[6] の「F」を挿入してから、要素番号1の要素から順にたどって出力する。配列の要素番号は1から始まる。next の値0はリストの終わりを表す。出力が A, C, F, E, D, B となるように【a】に入れる処理はどれか。
  3. 制御変数を5ずつ増やす次の for 文を実行した後の c の値はどれか。
  4. 次のプログラムの and は、左側の式が false のときは右側の式を評価しない(短絡評価)。cnt は大域変数である。実行した後の cnt の値はどれか。
  5. 要素数 n の配列 a から値 x を探し、見つかった要素番号を i に求める次のプログラムがある。配列の要素番号は1から始まる。and と or は、左側の式だけで結果が決まるときは右側の式を評価しない。【a】に入れる条件式のうち、x が a の中にないときに範囲外の a[n + 1] を参照してしまうものはどれか。