【问题标题】:Queue implementation with circular array使用循环数组的队列实现
【发布时间】:2012-01-30 08:45:40
【问题描述】:

我正在阅读有关 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 循环呢?。它在照顾什么条件?

【问题讨论】:

    标签: java algorithm data-structures queue implementation


    【解决方案1】:

    1。之所以有容量是因为

    (rear - front) 
    

    可以是负数,负模数因语言实现而异。

    2。你有第二个循环的原因是因为

    在这种情况下

    [#####000000####]
         ^      ^
        rear   front
    
    # is array item
    0 is empty space
    

    当你复制到一个更大的数组时,你会得到一个脱节的数组

    [#####000000####000000000000000]
    

    第二个循环移动

    [#####000000####000000000000000]
     ^---^
    

    [00000000000#########0000000000]
                    ^---^
    

    【讨论】:

    • 但是原始代码中的条件不是'rear
    【解决方案2】:

    第二个循环是确保项目以正确的顺序存储在新数组中。想象一个圆形缓冲区,其中 front(您要从中获取的地方)大于 back(您要添加东西的地方)。所以容量是 50,前面是 40,后面是 10。项目将从队列中删除,顺序为 40、41、42、43...0、1、2、... 9。

    现在,当您调整队列大小时,项目会以相同的顺序复制到新数组中。但是从现在容量为 100 的队列中移除的项目将是 40、41、42、... 49、50、51。但是位置 50 没有任何内容!

    所以这 10 个项目从位置 0 到 9 移动到位置 50 到 59。这就是第二个循环所做的。

    【讨论】:

      【解决方案3】:

      不熟悉这个类,但我猜如果队列已经回绕,以便在数组的开头写入新项目,那么“后”可能小于“前”。这种回答了你的两个问题,因为在这种情况下,(rear - front +1) % capacity 将是否定的,这不是你想要的(Q1),而且队列的新部分必须移植到最后,这产能增加(第二季度)。

      【讨论】:

      • 我会在第二位更详细地介绍,但是当我完成我的工作时,Herp 发布了一个非常好的答案;他的更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2020-02-10
      • 2015-11-03
      • 2012-09-27
      相关资源
      最近更新 更多