繁体   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