我碰巧在通过互联网阅读时遇到了基于数组的队列的实现:
#include <stdio.h>
#include <stdlib.h>
typedef int item_t;
typedef struct {item_t *base;
int front;
int rear;
int size;} queue_t;
queue_t *create_queue(int size)
{ queue_t *qu;
qu = (queue_t *) malloc( sizeof(queue_t) );
qu->base = (item_t *) malloc( size * sizeof(item_t) );
//printf("q->base address %p\n",qu->base);
qu->size = size;
qu->front = qu->rear = 0;
return( qu );
}
int enqueue( item_t x, queue_t *qu)
{
printf("modulo result %d\n",((qu->rear +2)% qu->size));
if ( qu->front != ((qu->rear +2)% qu->size) )
{ qu->base[qu->rear] = x;
qu->rear = ((qu->rear+1)%qu->size);
return( 0 );
}
else
return( -1 );
}
这是代码中的创建队列和入队逻辑。最初前面和后面是零。前面和前面((qu->rear +2)% qu->size)
不相等所以项目将被排队。我无法理解为什么在这个逻辑中使用了2个((qu->rear +2)% qu->size)
?
答案 0 :(得分:1)
因为如果使用(qu->;后+ 1)%qu-&gt;大小,并且元素将在几乎完整的队列中排队,那么q-&gt;后面将递增(这是在线完成的) “qu-&gt; rear =((qu-&gt; rear + 1)%qu-&gt; size);”)你会得到一个完整队列与空队列无法区分的情况。
将队列大小称为4个元素,然后添加4个实际元素,最后将“front”指向第0个元素(因为前面从未改变),“rear”将再次指向第0个元素作为“后”增加了4次,并在最后一次增量时将其包装回0.在这种情况下,前后指向第0个元素,这与队列为空时的开头相同,你无法判断队列是满还是空,这是一个问题(有时)。
此代码可能会略有变化,以反映设置队列时队列大小参数并不意味着您创建了大小为N的队列,而是创建了大小为N-1的队列....