【发布时间】:2015-02-02 02:26:54
【问题描述】:
我在网上阅读时碰巧遇到了基于数组的队列的实现:
#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 );
}
这是代码中的创建队列和入队逻辑。最初 front 和 back 是 zero.qu->front 和 ((qu->rear +2)% qu->size) 不相等,因此项目将被排队。我无法理解为什么在这个逻辑中使用 2 - ((qu->rear +2)% qu->size) ?
【问题讨论】:
-
当元素到达数组的“顶部”时,它会“包裹”。
-
如果我选择基于数组的队列的大小为 4 ,那么按照上述逻辑我只能将 2 个元素加入队列?
-
我没有仔细研究过算法。可能是最后几个元素从未分配过。但它是队列算法的典型“包装”。替代方法是要么在到达顶部时完全用完新元素,要么在从底部移除元素时停止并向下复制元素。
-
对于这种队列,检查队列本身是否“溢出”并即将“吞下它的尾巴”可能非常棘手。这可能是设计中最容易出错的部分。有一些方法可以使用所有元素,但如果不使用最后一对可以简化检查,那么这可能是一个很好的权衡。
-
如果我使用 ((qu->rear +1)% qu->size) 而不是 ((qu->rear +2)% qu->size) ,我将能够入队基于数组的大小为 4 的队列有 3 个项目。那么为什么不使用 1 进行包装,而是使用 2 呢?
标签: c pointers data-structures