C 使用环形缓冲区实现队列的代码

C 使用环形缓冲区实现队列的代码,c,queue,que,C,Queue,Que,这是在C中实现带环形缓冲区队列的程序的一部分。 我不明白第8-9行。 如果(q->rear==q->max)q->rear=0,那么这一行到底是什么意思平均值 如果后部索引等于最大容量。。。然后给后面赋值零?图特 请帮帮我 int Enque(IntQueue* q,int x) { if (q->num >= q->max) return -1; else { q->num++; q->que[q-&

这是在C中实现带环形缓冲区队列的程序的一部分。 我不明白第8-9行。 如果(q->rear==q->max)q->rear=0,那么这一行
到底是什么意思平均值

如果后部索引等于最大容量。。。然后给后面赋值零?图特 请帮帮我

int Enque(IntQueue* q,int x)
{
    if (q->num >= q->max)
        return -1;
    else {
        q->num++;
        q->que[q->rear++] = x;
        if(q->rear == q->max)
            q->rear = 0;
        return 0;
    }
}

q->que[]
是一个整数数组。单个数组
q->que[]
整数元素通过在数组中指定它们的索引来访问,例如:
q->que[n]
其中
n
是从
0
(q->max-1)
的值

q->rear
表示数组中的索引
q->que[]
q->rear
的值可以是
0
(q->max-1)
之间的任意位置。因此,如果
q->rear
变为等于
q->max
,它将表示超出
q->que[]
数组末尾的索引,并且(作为循环队列)必须放回数组的开头(
q->que[0]

因此,逻辑是:

if (q->rear == q->max)
    q->rear = 0;

请参阅Wikipedia上的环形缓冲区说明:。他们使用模运算而不是测试q->rear是否达到数组的大小注意
=
=
@AnttiHaapala之间的区别我想我知道=和==之间的区别。我不是吗?那你的问题为什么用它们both@AnttiHaapala哦,那是打字错误!谢谢提醒!请使用流动文本中代码摘录的反勾号哦,感谢您提供非常有用的评论!现在我明白了一点,但是如果后面的索引变为“零”,那么后面本身在那之后就没有什么事可做了,对吗?而前端索引仍在原来的位置?@JuyoungPark,代码并不表示前端索引的存在。IntQueue的定义可能包括前指针和后指针。显然,提供的代码不会处理未引用的内容。@JuyoungPark,Enque()函数的目的似乎是将整数存储在环形缓冲区中。每次调用Enque()都会将整数(由参数x提供)存储在索引q->rear的环形缓冲区中;然后前进(增量)q->后退。当q->rear到达q->que[]数组的末尾时,它将返回,以便调用Enque()将下一个整数(x)存储在数组的开头(偏移量0)。在下一次调用Enque()之后,将在偏移量1处存储整数,然后在偏移量2、3处存储整数,依此类推。@JuyoungPark,很可能还有另一个函数在q->front处从环形缓冲区中读取整数,然后将q->front前进(递增)到下一个索引。如q->rear,q->front在达到q->max时返回0。因此,que->front围绕环形缓冲区追逐q->rear,就像狗追逐它的尾巴一样。