簡體   English   中英

使用循環數組實現隊列

[英]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.

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