数据结构:关于Java实现的一个队列,对其中的扩容步骤有疑问?答题的都是我爹

队列的源码如上,经过一些出队入队和循环队列后操作后,该未扩容过的队列已经变成了如下形式现在数组已经满了,所以要开始扩容了,但是按照本示例代码的操作方式,扩容后队列就成下面... 队列的源码如上,经过一些出队入队和循环队列后操作后,该未扩容过的队列已经变成了如下形式

现在数组已经满了,所以要开始扩容了,但是按照本示例代码的操作方式,扩容后队列就成下面这个奇葩样子了

源码中为什么要在扩容后将front归零呢?这样不是把队列中的顺序打乱了么?

解决我问题的大哥都是我爹,请收下我这个儿子!实在想不明白这问题
展开
 我来答
百度网友5b1435d
2013-11-16 · TA获得超过203个赞
知道小有建树答主
回答量:259
采纳率:100%
帮助的人:104万
展开全部

这确实有点奇葩,要么修改resize方法,在进行复制的时候,先判断一下front和rear的值,如果front不为0,说明进行过出队列操作,再判断rear与front的值:

if(front < rear ){ //copy from front to rear 这样就可以去除多余的空位置,让front从0开始}
if(front > rear ){ 
//先复制后半段到新的数组,然后复制前半段到新数组的后面,这就保证0位置的就是队列的头  
}

这样的话,就可以理解为什么resize之后将front置为0,。

 

不知道这样的解释对不对,我看完上面的代码觉得就是这样的。

artintin
2013-11-16 · TA获得超过1.2万个赞
知道大有可为答主
回答量:7508
采纳率:80%
帮助的人:2881万
展开全部
确实是乱了,他的resize()方法实现的有问题,不能简单的使用System.arraycopy()
但front和rear肯定得改,否则计算对了长度会出现问题。

另外按照你的代码是不会出错的,因为没做任何其他操作,front一直是0
更多追问追答
追问
给我说懵了 到底是对还是不对呢=。=悲剧啊
追答
若队列在插入若干元素后进行了出队(删除)操作,那么会出现rear在front之前的情形,此时调用resize,队列次序是被打乱了。
但你的主程序中就是一个个插入,在这种情况下,他的resize没有碰到上述情形,不会出错了。
要保证代码无bug,resize方法中拷贝那行需要重写,若出现rear在front之前,需要分段拷贝两次。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阿里狗哥
2013-11-16
知道答主
回答量:39
采纳率:0%
帮助的人:28.5万
展开全部
儿子,从小我就教育你认真听课,独立思考。你却跑这认爹,太让我失望了,下面是答案,下不为例。
==========无耻的分割线============
是因为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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式