📜  门| GATE CS 2012 |第33章

📅  最后修改于: 2021-06-29 00:57:23             🧑  作者: Mango

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

–它始终指向从队列中进行下一次删除的位置。
尾巴–它始终指向下一个将在队列中进行下一个插入的空白位置。

我们将使用环绕功能,因为它是一个循环队列,当尾部或头部位于索引n-1时,下一个操作会将它们带到索引0。尽管数组内部容量为n,我们仍将保留一个空位以检测上溢(队列已满)和下溢(队列为空)情况。队列中的元素位于位置Q.head,Q.head +1,。 。 。 ,即Q.tail + 1,在这种情况下,我们以“ 0环绕”的方式感觉到位置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提供
这个问题的测验