Java 用循环数组实现队列
我正在阅读有关DynaArrayQueue(当没有足够的元素时,队列的大小会翻倍)的实现 我对其中的两种方法有一些疑问 让capacity为队列的容量 getQueueSize()方法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
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]
^---^