我正在尝试用Java实现Chars的Ring(循环队列),并且我很难想到如何在不使用数组上的.size()方法的情况下检测缓冲区是否为isEmpty。
因为如果环形缓冲区已满read pointer == write pointer
,而且环形缓冲区为空,read pointer == write pointer
所以我不确定如何正确检查isEmpty()。我知道我可以用.size()来做,但是我试图弄清楚它是否可以在没有它的情况下实现它。
我知道我需要在阵列末尾浪费一个空间,但我不确定如何检查它。支票会像if (head != (tail - 1))
一样简单吗?
另外,我正在尝试编写flush()
方法,并且我认为我可以这样做,每个循环看起来像这样:
for(char c : items){
c = (Character) null;
}
但eclipse向我大喊大叫,因为空指针访问需要自动装箱和拆箱。
非常感谢任何帮助。完整的课程如下:
public class RingBuffer {
private char[] items;
private int front;
private int rear;
private int last;
public RingBuffer(int capacity){
items = new char[capacity +1];
front = 0;
rear = 0;
last = capacity;
}
public void flush(){
for(char c : items){
c = (Character) null;
}
}
public boolean isEmpty(){
return false;
}
}
答案 0 :(得分:1)
您可以在维基百科上阅读有关完整/空缓冲区别的更多信息 http://en.wikipedia.org/wiki/Circular_buffer#Full_.2F_Empty_Buffer_Distinction
描述了多种解决方法。我会指出你提到的那个,也许是最容易理解的。
始终打开一个广告位
缓冲区永远不会填满最后一项,但总会有一个空槽。这意味着您可以像这样区分出full和empty:
public boolean isEmpty() {
return head == tail;
}
public boolean isFull() {
// don't forget about the modulo here
return head == ((tail - 1) % capacity);
}
当刷新时(我会将其命名为clear()
),您不必覆盖数组中的数据或分配新数据。你可以设置指向数组开头的指针。
public void clear() {
head = 0;
tail = 0;
}
这意味着缓冲区将被视为空。无论什么数据真正写入内存,它们都会被忽略然后被覆盖。
如果你喜欢这个答案,请将其标记为已接受。谢谢。