【问题标题】:How to make a circular buffer?如何制作循环缓冲区?
【发布时间】:2014-09-30 02:08:46
【问题描述】:

我必须从一个数组中为类创建一个循环缓冲区,但我不太了解这个概念是如何实现的。我知道有一些索引来回移动,但我真的不明白这是如何实现的。您甚至如何为数组的元素分配尾部或头部,或者以两种方式对它们进行索引?任何建议、代码或解释都会非常有帮助。

【问题讨论】:

  • 继续查看其他参考资料,可能是维基百科上带有 Circular buffer 等图形的参考资料。

标签: java buffer


【解决方案1】:

循环缓冲区基本上只是一个数组和两个整数,用于跟踪您认为是“尾”和“头”的位置。

空缓冲区以相同索引处的“tail”和“head”开始(0 是一个不错的选择)。

当您添加到缓冲区时,您在“尾部”点添加的位置插入,然后将尾部移动到下一个位置。它变得“圆形”,因为当“尾巴”从数组的末尾掉下来时,它会跳回到它的开头(索引 0)。

同样,您可以通过查看和调整各自的位置从缓冲区的头部或尾部移除。

【讨论】:

  • 所以尾巴掉下来的意思是你会把它放在头上吗?因为头部不总是索引 0 吗?
  • 当尾部超出数组末尾时,它从0 开始返回。仅当您从不从缓冲区的头部取出东西时,头部才会停留在0。否则,头部确实会“向后”移动。当tail追上head时,缓冲区已满。您可以选择允许(即覆盖现有元素),或使用异常中止(“缓冲区已满”)。
【解决方案2】:

您可以通过将结构的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次迭代

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多