20172310 2017-2018《程序设计与数据结构》(下)第三周学习总结

20172310 2017-2018《程序设计与数据结构》(下)第三周学习总结

教材学习内容总结

第五章 队列

  • 队列:队列是一种线性集合,其元素从一端加入,从另外一端删除,队列中的元素是按先进先出的方式处理的(FIFO)。一个队列一端为前端(front,head),
    一端为末端(rear,tail)。
    html

  • 队列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接口定义了另外两种方法,往队列中添加元素或从队列中删除元素。这些方法在异常类处理上有很大的不一样。
    一个是提供了一个布尔返回值,另外一个是抛出一个异常。java

  • 队列的应用
    • 代码密钥:凯撒加密法和重复密钥,队列是一种可存储重复编码密钥的便利集合。
    • 售票口模拟:一般用表示排队的队列来实现模拟。
  • 队列的ADT
    如同栈同样,可定义一个泛型的QueueADT接口,表示队列的操做,,是通常目标与各类实现方式分开。git

  • 用链表实现队列
    • 那两个分别指向链表首元素、链表末元素的引用方便队列的链表实现。
    • 若是链表是单向链表,就要区分从哪端添加哪端删除元素,双向链表则无所谓。
    • 链表实现队列有多个操做,如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的学习则要求我知道因此然,虽然国庆又快要到了,可是看样子博客仍是不会免的呀〒▽〒。


  • 我认为特别重要的技能(目前的水平、课程结束后达到的水平):
    • 程序理解技能 七、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

参考资料

相关文章
相关标签/搜索