【发布时间】:2014-09-30 02:08:46
【问题描述】:
我必须从一个数组中为类创建一个循环缓冲区,但我不太了解这个概念是如何实现的。我知道有一些索引来回移动,但我真的不明白这是如何实现的。您甚至如何为数组的元素分配尾部或头部,或者以两种方式对它们进行索引?任何建议、代码或解释都会非常有帮助。
【问题讨论】:
-
继续查看其他参考资料,可能是维基百科上带有 Circular buffer 等图形的参考资料。
我必须从一个数组中为类创建一个循环缓冲区,但我不太了解这个概念是如何实现的。我知道有一些索引来回移动,但我真的不明白这是如何实现的。您甚至如何为数组的元素分配尾部或头部,或者以两种方式对它们进行索引?任何建议、代码或解释都会非常有帮助。
【问题讨论】:
循环缓冲区基本上只是一个数组和两个整数,用于跟踪您认为是“尾”和“头”的位置。
空缓冲区以相同索引处的“tail”和“head”开始(0 是一个不错的选择)。
当您添加到缓冲区时,您在“尾部”点添加的位置插入,然后将尾部移动到下一个位置。它变得“圆形”,因为当“尾巴”从数组的末尾掉下来时,它会跳回到它的开头(索引 0)。
同样,您可以通过查看和调整各自的位置从缓冲区的头部或尾部移除。
【讨论】:
0 开始返回。仅当您从不从缓冲区的头部取出东西时,头部才会停留在0。否则,头部确实会“向后”移动。当tail追上head时,缓冲区已满。您可以选择允许(即覆盖现有元素),或使用异常中止(“缓冲区已满”)。
您可以通过将结构的tail 连接到它的head 来制作循环。在数组中,这可以通过多种不同的方式完成(迭代器、自定义类/处理程序等),但它们的共同点是 tail 之后的 next 元素是 head。
这是一个非常简单的示例,使用% 运算符来处理尾对头“连接”:
int[] ary = {0, 3, 5};
for(int i = 0; i < 100; i++) {
System.out.println(ary[i % 3]);
}
这个循环将输出: 0 3 5 0 3 5 0 3 5……100次迭代
【讨论】: