假设使用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提供
这个问题的测验