20172310 2017-2018《程序设计与数据结构》(下)第三周学习总结
20172310 2017-2018《程序设计与数据结构》(下)第三周学习总结
教材学习内容总结
第五章 队列
-
队列:队列是一种线性集合,其元素从一端加入,从另一端删除,队列中的元素是按先进先出的方式处理的(FIFO)。一个队列一端为前端(front,head),
一端为末端(rear,tail)。
-
队列ADT所定义的操作
-
Java API中的队列
1.Java集合API提供了java.util.Stack类,它实现了栈集合。但它并没有提供队列类,而是提供了一个Queue接口,
由多个类(包括LikedList类)来实现的。(课本例题5.1,5.3的代码都使用了Queue接口)
2.java.util.Stack类提供了传统的push、pop和peek等操作。而Queue接口并没有实现传统的enqueue、dequeue和first操作。
Queue接口定义了另外两种方法,往队列中添加元素或从队列中删除元素。这些方法在异常类处理上有很大的不同。
一个是提供了一个布尔返回值,另一个是抛出一个异常。 -
队列的应用
- 代码密钥:凯撒加密法和重复密钥,队列是一种可存储重复编码密钥的便利集合。
- 售票口模拟:通常用表示排队的队列来实现模拟。
-
队列的ADT
如同栈一样,可定义一个泛型的QueueADT接口,表示队列的操作,,是一般目标与各种实现方式分开。 -
用链表实现队列
- 那两个分别指向链表首元素、链表末元素的引用方便队列的链表实现。
- 如果链表是单向链表,就要区分从哪端添加哪端删除元素,双向链表则无所谓。
- 链表实现队列有多个操作,如enqueue操作、dequeue操作。
-
用数组实现队列
- 由于队列操作会修改集合的两端,因此将一端固定于索引0处要求移动元素。
- 非环形数组实现的元素移位,将产生O(n)的复杂度。(dequeue操作)因此,对于队列,我们是在其两端进行操作的,而
顺序也不是无关紧要的了,用固定数组来实现栈的效率不高 - 把数组看成环形的,可以出去在队列的数组实现中把元素移位的需要。
教材学习中的问题和解决过程
- 问题1:
在环形数组里进行添加或删除元素时,不需要移动哪个元素
这个是怎么理解呢?
- 问题1解决方案:
看这幅图是很好理解的,把元素添加进入数组,但是删除元素后,数组中的元素不进行移动,而是停留
在原来的位置,后续添加的元素,则跟在之前的元素后,让前面的位置为空,然后进行循环。
- 问题2:课本提出环形数组这个概念,是这样说的,“当队列的末端到达数组末端是将出现难题,要使得数组空闲空间得到很好的利用,
我们使用环形数组来实现队列。” 那利用环形数组难道可以解决“队列的末端到达数组末端”这个难题。 - 问题2解决方案:其实环形数组并不是不会遇到容量不够的问题,而是说不用一下扩大两倍的容量,导致内存空间的浪费。
环形数组要扩大容量,同样是先将数组扩大两倍,再将 原来的元素放入新的数组中。
代码调试中的问题和解决过程
-
问题1:课本上的代码有很多的错误,例如例题Codes
-
问题1解决方案:
这个例题的本意是想要对加密的内容进行解密,而且课本上encoded += (char)message.charAt(scan) - keyValue);
这行代码
不仅写法上存在错误——多了一个右括号,而且逻辑是完全不符合意思的,于是我进行了修改(我认为这是例题想要实现的功能)
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
上周没有习题测试
结对及互评
学号 2018-2019-20172309 《程序设计与数据结构(下)》第三周学习总结
点评:
- 博客中值得学习和改进的问题:
- 教材内容利用代码详细讲解,但是没必要将教材中的代码大量的放入博客中。
- 对课本代码有深入的思考,也可以提出改进意见。
点评的同学博客和代码
-
本周结对学习情况
- 结对学习内容
- 教材第五章关于用数组和链表来实现队列的内容的学习
- 蓝墨云课后练习的学习
- 课后习题的探讨
- 结对学习内容
-
上周博客互评情况
其他(感悟、思考等,可选)
本来很开心中秋佳节不用写博客了,现在看来是我太天真了(;´д`)ゞ,于是假期没有咋学习的我,节假日一结束
就陷入了疯狂看课本的模式。总结了一下,我们这两周就是细化了对栈和队列的学习,之前我只会使用栈和队列,
而他们的一些方法是如何实现的却没有考虑过,经过学习才发现,我们之前一直学习的数组和链表是这么的应用广泛
,每一个都可以用来实现栈和队列的很多方法学习果然是由浅入深,当初的我是只知其然,不知其所以然,而现在,
Java的学习则要求我知道所以然,虽然国庆又快要到了,但是看样子博客还是不会免的呀〒▽〒。
-
我认为特别重要的技能(目前的水平、课程结束后达到的水平):
- 程序理解技能 7、8分 9分
- 模块实现和逐步细化 5分 8分
- 效能分析和改进 5分 8分
- 接口设计 4分 7分
- 个人源码管理 6分 8分
-
你以及具备的专业知识、技能、能力上还差距哪些?
-
对于这个问题,其实我发现自己在专业知识、技能、能力还是有很大差距的。我们每周都要写博客,我不否认这是一种总结经验巩固知识的好手段,但有时候我发现自己其实是为了完成博客而在拼命看书,时间的限制导致自己其实有时候课本上的代码都还没理解透,就把他敲进电脑,所以自己的专业知识在有些方面还是不牢。要有好的编程的技能和能力一定要有严密和快速的逻辑思维能力,可能我在这方面真的不是很强,所以每次的实验都要花费很久的时间,但我能够完成这是令我开心的,我相信坚持坚持还是会有提高的。
学习进度条
|| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
| -------- | :----------------😐:----------------😐:---------------: |:-----😐
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 0/0 | 1/1 | 10/10 | |
| 第二周 | 326/326 | 1/2 | 18/28 | 学习在一点点的深入 |
| 第三周 | 784/1110 | 1/3 | 25/53 | |