2011-10-11 54 views
0

我有這樣的代碼工作正常添加:後值不圓陣隊列

public void add(AnyType item){ 
    if(isEmpty()){ 
     q[f]=item; 
    } 
    else{ 
     if(size==q.length){ 
      AnyType[] copyQ = (AnyType[]) new Object[q.length*2]; 
      System.arraycopy(q, f, copyQ, 0, q.length-f); 
      System.arraycopy(q, 0, copyQ, q.length-f, r); 
      f = 0; 
      q = copyQ; 
     } 
    } 
    q[r]=item; 
    r = (r+1)%(q.length); 
    size++; 
} 

但是當我想要得到的r價值它給了我比它實際上是一個更大的價值。另外,當我將一個數組的值複製到另一個數組時,有一個值會跳過一個值。我知道一切都與r = (r+1)%(q.length);的價值有關,我一直在努力工作幾個小時,但無法弄清楚。 將值賦給q [r]後,即使它只是第一個值,並且我嘗試獲取r的值應該是1,因爲它是由公式增加的,但我無法確定瞭解如何以不同的方式編寫循環隊列公式。 任何幫助將不勝感激。謝謝!

+0

你可能想解釋r應該是什麼 – Matt

+0

r是後面,f是前面。 q是隊列的名稱。 – randomizertech

回答

1

單元測試是你的朋友! :-)

表達你想要的行爲作爲測試,逐漸建立你的add()方法的複雜性,直到它的一切工作。我這樣做是爲了你的循環緩衝區和工作add()是這樣的:

public void add(AnyType item){ 
    if(isEmpty()){ 
     q[f]=item; 
    } 
    else { 
     if (size == q.length) { 
      AnyType[] copyQ = (AnyType[]) new Object[q.length*2]; 
      System.arraycopy(q, f, copyQ, 0, q.length-f); 
      System.arraycopy(q, 0, copyQ, q.length-f, (r + 1)); 
      f = 0; 
      r = q.length -1; 
      q = copyQ; 
     } 
    } 

    r = (r+1)%(q.length); 
    q[r]=item; 
    size++; 
} 

注意區別:

  • r是偏移 - 你不能在第二arraycopy()使用它作爲一個長度當您調整內部數組
  • 評價的改變順序進行更新
  • r需求,增加r存儲item
0

是因爲最後三行應該在else塊之內嗎?試着像代碼:

public void add(AnyType item){ 
    if(isEmpty()){ 
     q[f]=item; 
    } 
    else{ 
     if(size==q.length){ 
      AnyType[] copyQ = (AnyType[]) new Object[q.length*2]; 
      System.arraycopy(q, f, copyQ, 0, q.length-f); 
      System.arraycopy(q, 0, copyQ, q.length-f, r); 
      f = 0; 
      q = copyQ; 
     } 
    q[r]=item; 
    r = (r+1)%(q.length); 
    size++; 
    } 
} 

當三行else塊外,你在兩次增加的情況下,新元素時的數據結構是空的。

+0

不是兩次,只有一次。既然是隊列,你只能添加到R並從F中刪除。另外,R需要在每次添加之後遞增,並且大小也是如此。 – randomizertech