数据结构:关于Java实现的一个队列,对其中的扩容步骤有疑问?答题的都是我爹
队列的源码如上,经过一些出队入队和循环队列后操作后,该未扩容过的队列已经变成了如下形式现在数组已经满了,所以要开始扩容了,但是按照本示例代码的操作方式,扩容后队列就成下面...
队列的源码如上,经过一些出队入队和循环队列后操作后,该未扩容过的队列已经变成了如下形式
现在数组已经满了,所以要开始扩容了,但是按照本示例代码的操作方式,扩容后队列就成下面这个奇葩样子了
源码中为什么要在扩容后将front归零呢?这样不是把队列中的顺序打乱了么?
解决我问题的大哥都是我爹,请收下我这个儿子!实在想不明白这问题 展开
现在数组已经满了,所以要开始扩容了,但是按照本示例代码的操作方式,扩容后队列就成下面这个奇葩样子了
源码中为什么要在扩容后将front归零呢?这样不是把队列中的顺序打乱了么?
解决我问题的大哥都是我爹,请收下我这个儿子!实在想不明白这问题 展开
3个回答
展开全部
这确实有点奇葩,要么修改resize方法,在进行复制的时候,先判断一下front和rear的值,如果front不为0,说明进行过出队列操作,再判断rear与front的值:
if(front < rear ){ //copy from front to rear 这样就可以去除多余的空位置,让front从0开始}
if(front > rear ){
//先复制后半段到新的数组,然后复制前半段到新数组的后面,这就保证0位置的就是队列的头
}
这样的话,就可以理解为什么resize之后将front置为0,。
不知道这样的解释对不对,我看完上面的代码觉得就是这样的。
展开全部
确实是乱了,他的resize()方法实现的有问题,不能简单的使用System.arraycopy()
但front和rear肯定得改,否则计算对了长度会出现问题。
另外按照你的代码是不会出错的,因为没做任何其他操作,front一直是0
但front和rear肯定得改,否则计算对了长度会出现问题。
另外按照你的代码是不会出错的,因为没做任何其他操作,front一直是0
更多追问追答
追问
给我说懵了 到底是对还是不对呢=。=悲剧啊
追答
若队列在插入若干元素后进行了出队(删除)操作,那么会出现rear在front之前的情形,此时调用resize,队列次序是被打乱了。
但你的主程序中就是一个个插入,在这种情况下,他的resize没有碰到上述情形,不会出错了。
要保证代码无bug,resize方法中拷贝那行需要重写,若出现rear在front之前,需要分段拷贝两次。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
儿子,从小我就教育你认真听课,独立思考。你却跑这认爹,太让我失望了,下面是答案,下不为例。
==========无耻的分割线============
是因为System.arraycopy写错了吧。
应该是这样:System.arraycopy(data, front, tmp, 0, data.length);
data中的front代表队列头,front之前的是已经remove的,所以要从front开始拷贝数组。
另外resize里tmp=null完全没必要,tmp所指向的对象与data相同,tmp=null后data仍然引用,不会触发GC。
==========无耻的分割线============
是因为System.arraycopy写错了吧。
应该是这样:System.arraycopy(data, front, tmp, 0, data.length);
data中的front代表队列头,front之前的是已经remove的,所以要从front开始拷贝数组。
另外resize里tmp=null完全没必要,tmp所指向的对象与data相同,tmp=null后data仍然引用,不会触发GC。
更多追问追答
追问
不对啊
原数组是1、2、3、4、5
1、2出列变成了null、null、3、4、5
然后6、7入列后变成6、7、3、4、5
你这么复制的话3、4、5是有了,6、7没了啊
有空余空间会先利用循环队列机制,循环队列也用满了的话才会进行扩展数组=。=爹 你说的不对吧
追答
哦,循环队列。小看你了,儿。i'm proud of u.
你觉得这样如何呢?
public void resize() {
T[] TMP = (T[]) new Object[data.length*2];
System.arraycopy(data, front, tmp, 0, data.length - front);
System.arraycopy(data, 0, tmp, data.length - front, front);
data = tmp;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询