【问题标题】:Code for implementing queue with ring buffer使用环形缓冲区实现队列的代码
【发布时间】:2019-05-12 06:33:44
【问题描述】:

这是用 C 语言实现带有环形缓冲区的队列的程序的一部分。 我不明白第 8-9 行。 if(q->rear == q->max) q->rear = 0; 这一行到底是什么意思?

如果后索引等于最大容量...然后将零分配给后? T_T 请帮帮我!

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;
    }
}

【问题讨论】:

  • 参见维基百科上环形缓冲区的解释:en.wikipedia.org/wiki/Circular_buffer。他们使用模运算而不是测试 q->rear 是否达到数组的大小
  • 注意===的区别
  • @AnttiHaapala 我想我知道 = 和 == 之间的区别。 o_o 不是吗?
  • 那你的问题为什么同时使用它们
  • @AnttiHaapala Ohhh 那是错字!谢谢提醒!

标签: c queue que


【解决方案1】:

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[] 数组末尾的索引,并且(作为循环队列)必须定位回数组的开头(@ 987654335@).

因此,逻辑:

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

【讨论】:

  • 流动文本中的代码摘录请使用反引号
  • 哦,非常有用的评论!现在我明白了一点,但是如果后方索引变为“零”,那么后方本身就没有任何关系,对吧?前面的索引还在原来的地方吗?
  • @JuyoungPark,该代码不表示存在前端索引。也许 IntQueue 的定义包括一个前指针,以及一个后指针。显然,提供的代码不会操纵未引用的内容。
  • @JuyoungPark,Enque() 函数的目的似乎是将整数存储在循环环形缓冲区中。每次调用 Enque() 都会将整数(由参数 x 提供)存储在索引 q->rear 处的环形缓冲区中;然后前进(增量)q->rear。当 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 围绕环形缓冲区,就像狗追逐它的尾巴一样。
猜你喜欢
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多