C语言中基于数组的队列逻辑

时间:2015-02-02 02:26:54

标签: c pointers data-structures

我碰巧在通过互联网阅读时遇到了基于数组的队列的实现:

#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)

1 个答案:

答案 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的队列....