或许size的问题

来源:3-7 循环队列的实现

无心铁憨憨

2018-12-09

图片描述图片描述

场景是这样的,创建一个队列,传入容量是10,循环插入10个元素,然后删除一个元素,再插入两个元素,这个时候进行扩容,扩容的时候,我tail直接等于getSize()是有问题,而用一个变量去接收getSize()返回的值再赋给tail就是正确的,为什么tail直接等于getSize()会有问题呢?

写回答

1回答

liuyubobobo

2018-12-09

如果你是指把你的代码中int j = getSize改成tail = getSize()的话,是因为:getSize的计算依靠tail,如果在这里修改了tail,下面循环中使用getSize计算的结果就错了。


具体用一个测试用例,实际跟踪一下,看看这样写,程序发生了什么?


学习算法和数据结构这类底层知识和学习框架最大的一个区别就在于,debug时不会像学习框架时,非常容易就脱离了自己的逻辑,进入了框架的底层代码,使得在一些情况下调试跟踪非常有难度。算法和数据结构的近乎所有逻辑底层都是自己搭建的,如果发生逻辑错误,一定能追溯到自己的代码中。基本不涉及“使用不当”的问题。


所以,学习算法和数据结构,不仅仅要学习这些经典算法和数据结构背后的思想,更是一个锻炼逻辑思维和编程能力的过程。这也是大厂会更注重算法和数据结构的原因之一,通过算法和数据结构的考察,可以更好地考察逻辑能力和编程思维能力。这个过程中,debug是至关重要的。很多时候,自己觉得自己的实现没有问题,但跟进去,就发现了自己的逻辑漏洞。千万不要只对着代码看,一定要实际的动手调试。进步就发生在这个过程中。调试多了,才能练就眼睛看着代码,就像编译器在执行代码一样的本事:)


继续加油:)

0
1
无心铁憨憨
我明白了,size实际上是根据data.length实时计算的,而不是我们单纯的去维护这样的一个变量,那在扩容的时候data.length发生了改变,所以在计算size的时候就发生了错误的结果,直接tail = getSize不是不可以,但是应该在data = newData这步操作之前,因为这个时候data.length还是没有改变的,根据老师说的,我自己一步步deBug出来的,谢谢老师
2018-12-09
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1705 问题

查看课程