1 2 3 4

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 | |

参考资料

posted @ 2018-09-26 22:28  qx2017  阅读(223)  评论(2编辑  收藏  举报
页尾