【问题标题】:Circular Queue Implementation in JavaJava中的循环队列实现
【发布时间】:2022-01-19 15:47:43
【问题描述】:

我正在阅读我在 Github 中偶然发现的队列实现,并且很难理解为什么使用某些行为。 (可以找到存储库的链接here

  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. 我不确定为什么在 offer 函数中已经将项目插入队列后调整后索引,但在轮询中先调整头部索引。有什么不同吗?
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;
  }

谢谢

【问题讨论】:

    标签: java algorithm queue


    【解决方案1】:
    1. 他在上面提到过

    ArrayQueue 最大大小为data.length - 1。如果将数据数组视为循环,则变量rear 的位置在逻辑上总是在变量front 的前面。所以前后组合的状态数就是数据数组的长度。并且使用总状态之一来判断队列是空还是满。

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

    我希望这能回答您的问题。欢迎在 cmets 中提问。

    【讨论】:

    • 我确实看到了关于 data.length-1 的评论,但不明白。不会有前后没有元素的情况,利用整个队列大小吗?谢谢你的回答顺便说一句! @布拉德利101
    • 这怎么可能?只有front-rear == 1 否则它才会被填满
    • 我说的是在声明数组的大小时它将是 data.length-1,但我们在使用队列时使用了整个容量。 @布拉德利101
    • 顺便说一句,代码真的很糟糕。我不知道它是如何获得 11.5k 星的。我永远不会实现这样令人困惑的事情。
    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2020-02-10
    • 2023-03-03
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多