20172322 《程序设计与数据结构》第三周学习总结
20172322 《程序设计与数据结构》第三周学习总结
教材学习内容总结
在上周学习完关于栈的知识过后,这周我们学习了关于队列的知识。
- 队列与栈最大的不同就是队列是FIFO(先进先出)。
- 在Java API中提供了栈,但是却没有提供队列类,但是它却提供了一个Queue接口,这个接口由多个类来实现。在
Queue
接口中定义了一个element
方法,用于得到队列前端的值,提供了两个方法add
和offer
用于添加和插入元素,另外poll
和remove
从队列中删除元素。 - 代码密钥是队列使用的一个鲜明的例子,利用队列储存密钥可以使得代码密钥得以多次使用。
- 和上周类似,本周也是分别通过链表和数组的形式来实现队列。与StackADT类似,这次也有一个名为
QueueADT
的接口,我们的主要任务也是实现它的enqueue
dedqueue
first
isEmpty
size
toString
- 链表方式实现队列:
enqueue
操作,在队列末端添加一个新元素,将当前末尾元素的next引用指向需要添加的新元素,并且将tail
引用设置为新元素。dequeue
操作删除队列前端的元素直接令head = head.getNext
即可,不过需要注意当删除掉队列的最后一个元素后,head
和tail
的引用都是null
。其他需要实现的内容在后面部分会提及。 - 数组方式实现队列:普通的线性数组在处理队列问题时的空间复杂度很高,故在书中使用了环形数组来实现队列(环形数组:数组的最后一个索引后面跟的是第一个索引),
enqueue
dedqueue
的实现引入了取余操作符%
以便rear
和front
的值无误。
- 链表方式实现队列:
教材学习中的问题和解决过程
- 问题1:书上有一句话“对于队列,我们是在其两端进行操作的,而顺序也不是无关紧要的了,因此,用固定数组来实现栈的效率不高”,我当时读到这句话的时候十分疑惑,队列的顺序很重要所以实现栈的效率不高?
- 问题1解决方案:对比之前书上所提到的“固定数组实现策略是对栈高效的”,并且在网上查阅资料得到,这句话是书本的一个问题,应该是“用固定数组来实现队列的效率不高”
代码调试中的问题和解决过程
在上周学习了分别使用链表和数组来实现栈以后,本周利用数组和链表来实现对流相对简单,仅需要对部分代码进行修改即可,但还是存在了一个问题:
-
问题1:在对环形数组类
CircularArrayQueue
进行补全时前面几个方法都比较简单,但是size
和toString
方法出现了问题。 -
问题1解决办法:经过一系列的验证发现问题的产生是出现
size
方法上,因为toString
方法调用了size
。 -
解决这次问题我使用了三种方法:
-
第一种:
-
导致的问题:
导致了数组的长度为1600,并且出现了非常多的null。
-
第二种:
-
导致的问题:
size
方法调用显示的还是删除以前的样子。
-
第三种:
我在网上查阅相关资料(《JAVA-循环数组实现简单的队列》)以后,问题终于得以解决。
代码托管
上周考试错题总结
上周没有考试,故也没有错题。
结对及互评
- 博客中值得学习的或问题:
- 在她的博客中“循环队列”和“顺序队列”使用了图解的方法,更便于理解。
- 代码中值得学习的或问题:
- 在博客中体现了许多代码,更加方便,值得学习
点评过的同学博客和代码
- 本周结对学习情况
-
结对学习内容
- 主要讨论了蓝墨云的课堂实践内容,对于用链表实现插入和删除的功能进行了深入地探讨
其他
- 感悟:学会了基本的链表与数组的知识过后对于利用这两者来实现无论是栈或是队列都比较简单。
课本单词
(本部分用于收集本章节后的生词)
- Ceasar cipher:凯撒加密法
- circular array:环形数组
- dequeue:队列操作,前端删除一个元素
- enqueue:队列操作,尾端增加一个元素
- FIFO:先进先出
- queue:队列
- repeating key:重复密钥
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/5000 | 2/2 | 8/8 | 认真学习!积极向上 |
第二周 | 812/812 | 1/3 | 22/30 | |
第三周 | 814/1626 | 1/4 | 20/50 |
-
计划学习时间:20小时
-
实际学习时间:20小时
-
改进情况:继续加紧学习的脚步。
补充作业
技能 | 课前评估 | 课后评估 |
---|---|---|
对编程整体的理解 | 4 | 8 |
程序理解 | 4 | 8 |
构架设计,模块化设计,接口设计 | 3 | 8 |
单元测试,代码覆盖率 | 5 | 9 |
代码质量 | 3 | 8 |
效能分析和改进 | 2 | 7 |