簡體   English   中英

Java中的循環隊列實現

[英]Circular Queue Implementation in 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. 我不確定為什么在商品 function 中的商品已插入隊列后調整后索引,但在輪詢中調整了頭部索引。 這有什么不同嗎?
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。如果將數據數組視為循環,則變量的位置在邏輯上總是在變量 front 的前面。 所以前后組合的狀態數就是數據數組的長度。 並且總狀態之一用於判斷隊列是空的還是滿的。

  1. read是在后面調整的,因為rear是應該添加新元素的地方。 添加元素后,它會遞增。 front是元素應該被彈出的索引,因為它已經有了元素。
  2. 請記住,項目的最大數量是data.length - 1所以如果隊列應該是滿的, front - rear必須等於1

我希望這回答了你的問題。 隨時在評論中提問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM