Java中的循环队列实现



我正在阅读一个在Github中偶然发现的队列实现,很难理解为什么要使用某些行为。(指向存储库的链接可以在这里找到(

  1. 该代码将用户期望用来声明队列大小的初始容量加1。所有者解释说,这是因为最初的最大大小是data.length-1,但没有解释原因。这是代码的一部分:
public ArrayQueue(int capacity) {
// ArrayQueue maximum size is data.length - 1.
data = new Object[capacity + 1];
front = 0;
rear = 0;
}
  1. 我不知道为什么在项目已经插入报价功能中的队列后会调整后部索引,而在轮询之前会调整头部索引。这有什么不同吗
public void offer(T elem) {
if (isFull()) {
throw new RuntimeException("Queue is full");
}
data[rear++] = elem;
rear = adjustIndex(rear, data.length);
}
public T poll() {
if (isEmpty()) {
throw new RuntimeException("Queue is empty");
}
front = adjustIndex(front, data.length);
return (T) data[front++];
}
  1. 为什么我们需要将data.length添加到(前-后(以检查列表是否已满
public boolean isFull() {
return (front + data.length - rear) % data.length == 1;
}

谢谢

  1. 他在上面提到过

ArrayQueue最大大小为data.length-1。如果将数据数组视为圆形,则从逻辑上讲,变量后部的位置总是在变量前部的前面。因此,前后组合的状态数就是数据阵列的长度。其中一个状态用于判断队列是空的还是满的。

  1. read在之后进行调整,因为rear是应该添加新元素的位置。添加元素后,它将递增。front是元素应该弹出的索引,因为它已经拥有了元素
  2. 请记住,最大项目数是data.length - 1,因此如果队列应该已满,则front - rear必须等于1

我希望这能回答你的问题。欢迎在评论中提问。

最新更新