假设一个容量为 (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 提供
这个问题的测验