【问题标题】:rear value not working properly in circular array queue后值在循环数组队列中无法正常工作
【发布时间】:2011-10-11 22:48:34
【问题描述】:

我有这个添加代码:

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,因为它是由公式增加的,但我无法弄清楚如何在不弄乱循环队列公式的情况下以不同的方式编写它。 任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 你可能想解释一下 r 的含义
  • r 是后部,f 是前部。 q 是队列的名称。

标签: java arrays queue circular-buffer


【解决方案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

【讨论】:

    【解决方案2】:

    是因为最后三行应该在 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 块之外时,你添加了两次新元素,以防数据结构为空。

    【讨论】:

    • 不是两次,只有一次。由于是一个队列,你只能添加到 R 和从 F 中删除。另外,R 需要在每次添加后以某种方式递增,大小也是如此。
    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多