ADT循环队列入队并出列

时间:2014-12-31 07:15:56

标签: c

#define SIZE 5
struct queue{   float data[SIZE];
                int head,tail;
};

void init(struct queue *q){ q->head=0; q->tail=SIZE-1; }
int  empty(struct queue *q){
    int temp=q->tail+1;
    if(temp==SIZE) temp=0;
    return temp==q->head;
}
int  full(struct queue *q){
    int temp=q->tail+2;
    //if(temp==SIZE) temp=0;
    //if(temp==SIZE+1) temp=1;
    if(temp>=SIZE) temp-=SIZE;
    return temp==q->head;
}
void enqueue(struct queue *q, float item){
    if(++q->tail>=SIZE) q->tail-=SIZE;
    q->data[q->tail]=item;
}
float dequeue(struct queue *q){
    float temp= q->data[q->head];
    if(++q->head>=SIZE) q->head-=SIZE;
    return temp;
}

上面的代码由我的教授提供,我在理解入队函数if(++q->tail>=SIZE) q->tail-=SIZE;部分和出列函数if(++q->head>=SIZE) q->head-=SIZE;时遇到困难我为什么需要评估这些条件?有人请详细向我解释......谢谢

3 个答案:

答案 0 :(得分:0)

队列是循环的。当您尝试将项目入队时

void enqueue(struct queue *q, float item){
    if(++q->tail>=SIZE) q->tail-=SIZE;
    q->data[q->tail]=item;
}

并且队列的尾部将到达SIZEth元素(在队列末尾的索引处的理论元素),该队列用于包装和覆盖队列开头的项目。

答案 1 :(得分:0)

此方法也适用于其他问题 你应该拥有或知道代码应该做什么 在这个特殊的问题中,我们正在处理循环队列,这意味着 有些东西(数字)站在一个有限大小的队列中,第一个离开是在它的头部,最后到达的是在尾部。

循环队列是'循环',因为头尾的“等待点”不断变化,而队列的最大大小保持不变。 这个想法是你不要移动队列中的项目(比如队列中的人)你只是标记该队列中的第一个和最后一个项目并保留顺序

要正确理解您应该首先尝试的那些陈述 扩展复合语句。

if(++q->tail>=SIZE) q->tail-=SIZE;

根据this table 这意味着:

++q->tail /* we have a new arrival, tail is always the index of the last to come-in*/
/* lets say that the previous arrival was placed in q->data[4], the last element of the array, where we should put the new one? q->tail is now 5 but data[5] is out of bounds */
if((q->tail) >= SIZE) /* we increased the index but we have limited space in the array*/       
   /* this is the "circular" part. for size=5 it means that tail 
      was over the limit and should do the circle back to 0 to 
      make space for the new arrival */
   q->tail -= SIZE;

尝试自己包围出队。使用优先规则将语句解压缩为几个。

答案 2 :(得分:0)

让我举个例子:

看到这张图片: Enqueue image (由于信誉点,我无法在此处发布图片,因此,提供链接)

现在, 在图1中:

head = 0,tail = 3

所以,首先我们需要检查是否tail==size-1。但事实并非如此。 1,所以,我们只需要增加尾部并在该位置存储新项目。

在图中2:

head = 2,tail = 7

所以,首先我们需要检查是否tail==size-1。因此,我们将增加尾部,然后从中减去size以获得tail=0

总结这些步骤,我们需要增加tail并检查tail==size-1,如果确实如此,我们需要tail=tail-size。那么,我们的代码所做的就是结合步骤增量和检查。因此,它通过语句tail检查size的递增值++q->tail>=size。如果是,则从size中减去tail

无论条件是真是假,都会发生++q->tail

如果你不熟悉C语言,你可以在enquque中选择这个替代方案:

++q->tail;    // or q->tail=q->tail+1 or q->tail+=1;
if(q->tail==size)
    q->tail=q->tail-size;
q->data[q->tail]=item;

同样可以用头部来解释。