[英]Queue implementation with circular array
我正在閱讀關於DynaArrayQueue的實現(當沒有足夠的元素時,隊列的大小加倍)
我對其中的兩種方法有一些疑問。
設容量是隊列的容量。
getQueueSize()方法
public int getQueueSize()
{
if(front == -1) return 0;
//Here why can't the size by simply [(rear -front +1) %capacity ]
int size = (capacity - front + rear +1) % capacity;
if(size == 0) return capacity;
else return size;
}
在計算尺寸時我們使用的原因
size = (容量 - 前+后+ 1) %容量,而不是簡單(后 - 前+1) %容量。 ?
問題2:
resizeQueue()
這是調整隊列大小的方法
private void resizeQueue()
{
int initCapacity = capacity;
capacity *=2;
int[] oldArray = array;
array = new init[this.capacity];
//this is fine
for(int i=0; i<oldArray.length;i++)
{
array[i] =oldArray[i];
}
//why do we need this ?
if(rear < front)
{
for(int i =0 ; i<front ; i++)
{
array[i+initCapacity] = this.array[i];
array[i]= null;
}
rear = rear + initCapacity;
}
}
方法中的第一個for循環是直接的,但為什么我們需要第二個if循環呢? 。 這是什么條件照顧?
(rear - front)
可以是負的,負模數因語言實現而異。
在這種情況下
[#####000000####]
^ ^
rear front
# is array item
0 is empty space
復制到更大的數組時,會得到一個脫節的數組
[#####000000####000000000000000]
第二個循環移動
[#####000000####000000000000000]
^---^
至
[00000000000#########0000000000]
^---^
第二個循環是確保項目以新數組中的正確順序存儲。 想象一個循環緩沖區,前面(你要取的地方)大於后面(你要添加的東西)。 因此容量為50,前面為40,后面為10.項目將按順序40,41,42,43 ... 0,1,2,... 9從隊列中刪除。
現在,當您調整隊列大小時,項目將以相同的順序復制到新陣列。 但是從隊列中刪除現在容量為100的項目將是40,41,42,... 49,50,51。但是在50位沒有任何東西!
所以這10個項目從0到9位置移動到50到59位置。這就是第二個循環的作用。
不熟悉這個類,但我想如果隊列已經纏繞,那么在數組的開頭寫入新項目,那么“后”可能小於“前”。 這樣可以解答你的兩個問題,因為在這種情況下, (rear - front +1) % capacity
將是負數,這不是你想要的(Q1),並且隊列的新部分也必須被移植到最后,容量增加(Q2)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.