2011-10-11 58 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