20162305 2017-2018-1 《程序设计与数据结构》第5周学习总结
教材学习内容总结
一、栈
栈是一个线性集合,其元素的添加及删除都在一端进行。栈的处理数据方式为后进先出,最后入栈的元素最先移出栈,使用栈处理问题遵从反序。
二、泛型
泛型,即可以定义一个类,它保存、操作并管理直到实例化才确定类型的对象。我认为就是在一个类中利用多态技术写好各种对象,等到需要这个对象的时候在用方法调用出来。
三、链式结构
在计算机中用一组任意的存储单元存储线性表的数据元素,利用指针可以对链中的各种元素进行添加删除等操作,比较方便。
四、利用数组实现栈
首先了解数组的几个关键特性:存储在数组中的元素的下标为0到n-1,其中n是数组总的单元数。一个数组是一个对象,应该分别对其中所保存的对象进行实例化。设计栈的数组时,栈底总位于数组下标为0的位置,栈中的元素按序连续保存在数组中。在这个类中定义pop、push、peek、isEmpty等操作。
五、使用链实现栈
使用链表来实现栈,仅需要一个引用指向表的第一个结点,并了解表中的元素个数count,基于栈只允许在一端添加或删除元素这个属性,所以只需要在链表的一端进行操作。在这个类中也同样定义push、pop、peek等操作。
教材学习中的问题和解决过程
- 问题1:管理链表中,哨兵结点的存在可以去掉处理第一个结点的特殊情形,哨兵结点的用法是怎么样的?
- 问题1解决方案:我在网上找到了一段介绍哨兵结点的文字:“哨兵节点(sentinel)是一个哑元节点(dummy node),可以简化边界条件。是一个附加的链表节点,该节点作为第一个节点,它的值域中并不存储任何东西,只是为了操作的方便而引入的。如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点。
很多情况下,需要处理当前节点的前驱节点,如果是没有哨兵节点的链表,对第一个节点,即头节点,没有前驱节点。如果不作特殊处理,就可能出错;如果对它特别对待,就会增加代码复杂性,还会降低程序效率。而如果有哨兵节点的话, 线性表的每个位置的节点都有前驱节点,因此可以统一处理。
当链表为空时,没有哨兵节点的链表的头节点为NULL,处理起来也和其他情况不同。带哨兵节点的链表,当其为一个空链表时,仅含哨兵节点,哨兵节点的指针域为空,和其他情况的表尾是一样的。”我还是更倾向于叫他虚位结点,它作为一个假的首结点,里面为空,真正链中第一个元素在第二个节点中,对链表中首位元素的插入和删除就可以在第一个结点和第二个结点之间进行,避免对第一个结点的特殊操作,提高效率。 - 问题2:ArrayStack中代码分析中提出,不能对泛型实例化,也不能实例化泛型数组,为什么?
- 问题2解决方案:重新阅读教材中之前有关泛型的介绍,我了解到泛型的使用是为了在使用类的时候可以定义更多的对象,不过各个对象之间的类型不同,虽然都是属于同一个类,不过彼此之间相互独立,实例化泛型也没有意义。他们不过是一个占位符,允许我们定义可管理实例化时才确定类型对象的类。
代码调试中的问题和解决过程
- 问题1:不清楚LinkedStack中的pop方法。
T result = top.getElement();
top = top.getNext();
count-;
- 问题1解决方案:结合LinearNode代码理解,先将top中的元素获取并赋值给result,返回result,再用LinearNode中的getNext方法获取下一个元素到top中,这样实现了弹出元素的操作。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 错题1:
As the number of items in a search pool grows, the number of comparisons required to search _______________ .
A .
increases
B .
decreases
C .
stays the same
D .
goes to 0
E .
none of the above
- 正确答案:A
- 解析:随着搜索池中的元素增多,查找元素所需要的比较越多。
- 错题2:
Which of the following algorithms is most easily expressed recursively?
A .
linear search
B .
quick sort
C .
bubble sort
D .
selection sort
E .
none of the above algorithms are easily expressible recursively
- 正确答案:B
- 解析:快速排序最容易递归地表示。
- 错题3:
The ___________________ of an algorithm shows the relationship between the size of the problem and the value we hope to optimize.
A .
growth function
B .
rowth analysis
C .
size function
D .
size analysis
E .
none of the above
- 正确答案:A
- 解析:一个算法的增长函数表明我们希望优化价值问题的大小之间的关系。
- 错题4:
If there are more items in a search pool, then it will typically require more comparisons to find an item.
A .
true
B .
false
- 正确答案:A
- 解析:如果搜索池中有更多的项,则通常需要更多的比较来查找项。
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
其他(感悟、思考等,可选)
勤学多练,大学生活的学习一定要利用好各种碎片化的时间,代码需要多敲多写多出问题才能进步。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 20/20 | |
第二周 | 100/100 | 1/2 | 15/35 | |
第三周 | 454/554 | 1/3 | 15/50 | |
第四五周 | 772/1326 | 2/5 | 20/70 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)