我正在閱讀我在 Github 中偶然發現的佇列實作,并且難以理解為什么使用某些行為。(可以在此處找到存盤庫的鏈接)
- 該代碼將用戶期望宣告的佇列大小的初始容量加 1。店主解釋說這是因為初始最大大小是data.length - 1,但沒有解釋原因。這是代碼的那部分:
public ArrayQueue(int capacity) {
// ArrayQueue maximum size is data.length - 1.
data = new Object[capacity 1];
front = 0;
rear = 0;
}
- 我不確定為什么在商品已插入到 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 ];
}
- 為什么我們需要將 data.length 添加到 (front-rear) 來檢查串列是否已滿?
public boolean isFull() {
return (front data.length - rear) % data.length == 1;
}
謝謝
uj5u.com熱心網友回復:
- 他上面已經提到了
ArrayQueue 的最大大小為data.length - 1。如果將資料陣列視為回圈,則變數rear 的位置在邏輯上始終位于變數front 的前面。所以前后組合的狀態數就是資料陣列的長度。總狀態之一用于判斷佇列是空還是滿。
read
之后調整因為rear
是應該添加新元素的地方。添加元素后,它會遞增。Andfront
是元素應該彈出的索引,因為它已經有元素了。- 還記得專案的最大不就是
data.length - 1
這么front - rear
有平等1
如果佇列應該是滿的。
我希望這回答了你的問題。歡迎在評論中提問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/387606.html
上一篇:決議不起作用:在拋出“std::invalidargument”實體后呼叫終止
下一篇:計算偽代碼的時間復雜度