Java 用循环数组实现队列

Java 用循环数组实现队列,java,algorithm,data-structures,queue,implementation,Java,Algorithm,Data Structures,Queue,Implementation,我正在阅读有关DynaArrayQueue(当没有足够的元素时,队列的大小会翻倍)的实现 我对其中的两种方法有一些疑问 让capacity为队列的容量 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 + rea

我正在阅读有关DynaArrayQueue(当没有足够的元素时,队列的大小会翻倍)的实现

我对其中的两种方法有一些疑问

让capacity为队列的容量

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;
 }
在计算尺寸时,我们为什么使用

大小=(容量-前+后+1)%容量,而不是简单的(后-前+1)%容量

问题2:

调整队列大小()

这是调整队列大小的方法

  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;

}


  }
private void resizeQueue()
{
int initCapacity=容量;
容量*=2;
int[]oldArray=数组;
array=newinit[this.capacity];
//这很好
对于(int i=0;i1)。容量存在的原因是
可以是负数,负数模因语言实现而异

2.你有第二个循环的原因是 在这种情况下

[#####000000####]
     ^      ^
    rear   front

# is array item
0 is empty space
复制到较大的数组时,会得到一个不连贯的数组

[#####000000####000000000000000]
第二个循环移动

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


第二个循环是确保项目以正确的顺序存储在新数组中。想象一个循环缓冲区,其中前部(您正在使用的位置)大于后部(您正在添加项目的位置)。因此容量为50,前部为40,后部为10。项目将按40、41、42、43…0、1、2…9的顺序从队列中移除

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


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

不熟悉这个类,但我猜如果队列已结束,因此新项目将在数组的开头写入,那么“后”可能小于“前”。这种类型回答了您的两个问题,因为在这种情况下,
(后-前+1)%capacity
将是负数,这不是您想要的(Q1),而且队列的新部分必须移植到末端,这会增加容量(Q2).

我想对第二部分进行更详细的说明,但就在我完成我的回答时,Herp给出了一个非常好的答案;他的答案更好。但原始代码“后<前”中的条件不是更好吗?在您的示例中,后大于右前?
[#####000000####000000000000000]
 ^---^
[00000000000#########0000000000]
                ^---^