📜  门|门CS 2012 |问题 33

📅  最后修改于: 2021-09-25 07:43:14             🧑  作者: Mango

假设一个容量为 (n – 1) 个元素的循环队列是用 n 个元素的数组实现的。假设插入和删除操作分别使用REAR和FRONT作为数组索引变量。最初,REAR = FRONT = 0。检测队列满和队列空的条件是
(A)满:(REAR+1) mod n == FRONT,空:REAR == FRONT
(B)满:(REAR+1) mod n == FRONT,空:(FRONT+1) mod n == REAR
(C)满:REAR == FRONT,空:(REAR+1) mod n == FRONT
(D)满:(FRONT+1) mod n == REAR,空:REAR == FRONT答案:(一)
解释:
循环队列的实现:

Head – 它总是指向队列中下一次删除发生的位置。
尾部– 它始终指向队列中将发生下一次插入的下一个空位置。

我们将使用环绕功能,因为它是一个循环队列,当尾部或头部位于索引 n-1 时,下一个操作会将它们带到索引 0。尽管数组内部有 n 的容量,我们将保留一个空位,以检测溢出(队列满)和下溢(队列空)情况。队列中的元素位于位置 Q.head, Q.head + 1, … . . , Q.tail + 1,我们“环绕”的意思是位置 0 以循环顺序紧跟在位置 n-1 之后。

算法 :

ENQUEUE(Q, x)                        
{

  if Q.head == Q.tail + 1
      error "Queue overflow"

  Q[Q.tail] = x

  if Q.tail == Q.length    - 1
      Q.tail = 0
  else
      Q.tail = Q.tail + 1
}


DEQUEUE(Q)
{
  if Q.head == Q.tail
      error "Queue underflow"

  x = Q[Q.head]

  if Q.head == Q.length - 1
      Q.head = 0
  else
      Q.head = Q.head + 1

  return x
}

见 http://en.wikipedia.org/wiki/Circular_buffer#Always_Keep_One_Slot_Open

此解决方案由Pranjul Ahuja 提供
这个问题的测验