20172313 2018-2019-1 《程序设计与数据结构》第三周学习总结

20172313 2018-2019-1 《程序设计与数据结构》第三周学习总结

教材学习内容总结

  • 概述

    • 队列是一种线性集合,其元素从一端加入,从另一端删除;队列的元素是按FIFO方式处理的。第一个进入的元素,也就是第一个退出的元素。
    • 队列有队头(front)和队尾(rear),数据从队尾进入队列,从队头出队列,队头(front)指向队列的第一个数据,队尾(rear)指向队列中的最后一个数据。

  • JavaAPI中的队列
    • Java集合API提供了java.util.Stack类,它实现了栈集合。但它并没有提供队列类,而是提供了一个Queue接口,由多个类(包括LikedList类)来实现的。
    • java.util.Stack类提供了传统的push、pop和peek等操作。而Queue接口并没有实现传统的enqueue、dequeue和first操作。Queue接口定义了另外两种方法,往队列中添加元素或从队列中删除元素。着西方大在异常类处理上有很大的不同。一个是提供了一个布尔返回值,另一个是抛出一个异常。
  • 用链表实现队列
    • 实现队列时,我们要操作链表的两端。除了一个指向链表首元素的引用(front)之外,还需要跟踪另一个指向链表末元素的引用(rear)。还要用一个整型变量count来跟踪队列中的元素数目。
    • 当创建队列时队列中没有数据,front和rear的值都为null。当插入第一个数据时,将front和rear都指向第一个结点对象。
    • 后续在插入数据时就利用rear进行数据的插入。
  • 用数组实现队列
    • 由于队列操作会修改集合的两端,因此将一端固定于索引于0处要求移动元素。
    • 非环形数组实现的元素移位,将产生O(n)的复杂度。
    • 固定数组实现策略在栈的实现中很高效,但在队列的实现中则不是这样。这个示例说明,用于实现集合的数据结构与集合本身的匹配是非常重要的。固定数组实现策略对栈是高效的,是因为所有的活动(添加和删除元素)都是在集合的一端进行的,因而也是在数组的一端进行的。而对于队列,我们是在其两端进行操作的,而顺序也不是无关紧要的了,因此,用固定数组来实现栈的效率不高。
    • 把数组看作是环形的,可以除去在队列的数组实现中把元素移位的需要。实现环形数组有以下两种方法。
      • 添加一个属性size用来记录眼下的元素个数。
        目的是当head=rear的时候。通过size=0还是size=数组长度。来区分队列为空,或者队列已满。
      • 数组中仅仅存储数组大小-1个元素,保证rear转一圈之后不会和head相等。也就是队列满的时候。rear+1=head,中间刚好空一个元素。当rear=head的时候。一定是队列空了。

队列的示意图

实现队列时,要注意的是假溢出现象。如上图的最后一幅图。如图所看到的的假溢出现象

解决的方法:使用链式存储,这显然能够。在顺序存储时。我们常见的解决的方法是把它首尾相接,构成循环队列。这能够充分利用队列的存储空间。
循环队列示意图:

在上图中。front指向队列中第一个元素。rear指向队列队尾的下一个位置。
但依旧存在一个问题:当front和rear指向同一个位置时,这代表的是队空还是队满呢?大家能够想象下这样的情景。
解决这种问题的常见做法是:
1.使用一标记,用以区分这样的易混淆的情形。
2.牺牲一个元素空间。当front和rear相等时,为空。当rear的下一个位置是front时。为满。
例如以下图:

  • 双端队列

    • 详见下面教材问题解决。

教材学习中的问题和解决过程

  • 问题1:在学习教材上的内容时,例题5.3使中使用队列进行储存代码密钥。在总结中,有这样一句话:队列是一种可存储重复编码密钥的便利集合。我对于这句话不是很理解。
  • 问题一解决:队列的元素是按FIFO方式处理的。第一个进入的元素,也就是第一个退出的元素。只要在用到每个密钥值之后将其放回到队列中即可。队列的性质使得密钥值能保持正确的次序;不用担心何时抵达密钥末尾,该如何从头开始。
  • 问题2:课后自测题:队列的五种基本操作是什么?
  • 问题二解决:queue--往队列末端添加一个元素 dequeue--从队列前端删除一个元素 first--返回一个指向队列前端元素的引用 isEmpty--当队列为空时返回true,否则返回false size--返回队列中元素的数目
  • 问题3:教材在这章的末尾提到了双端队列,对于双端队列的实现存在一些疑问,不清楚实现队列时指针的应用。
  • 问题三解决:双端队列(deque double ended queue(双端队列))是一种相对于队列的一种数据结构。它可以在尾部和头部插入、移除和获取。和 Queue类似,每个操作都有两种方法,一种在异常情况下直接抛出异常奔溃,另一种则不会抛异常,而是返回特殊的值,比如 false, null …

    双端链表不同于单向链表仅有一个指针域指向下一个节点,而是同时持有下一个和上一个指针域,分别指向下一个和上一个节点

代码调试中的问题和解决过程

  • 问题1:在做习题pp5_1的时候,向队列中添加了两个不同的int型数值,但是输出的时候两个都是第一次输入的数值。
  • 问题1解决方案:输出的两个数值相等,我的第一反应是添加的方法有问题,再添加节点的时候只能为节点保存相同的数值,再仔细检查了添加的代码后,发现是没有问题的。
public void enqueue(T element) {
        LinearNode<T> node = new LinearNode<T>(element);

        if(isEmpty())
            head = node;
        else
            tail.setNext(node);
        tail = node;
        count ++;

    }
  • 由于节点的代码使用的是跟上一张相同的代码,所以节点也不会有问题,我在debug之后发现,在我的toString方法中指针无法指向下一个节点,原来我忘记把下一个节点的引用赋值给current节点了,导致打印的时候无法正常遍历。

代码托管

上周考试错题总结

  • 这周没有错题~

结对及互评

  • 博客中值得学习的或问题:

    • 排版精美,对于问题研究得很细致,解答也很周全。
  • 代码中值得学习的或问题:
    • 代码写的很规范,思路很清晰,继续加油!

点评过的同学博客和代码

其他(感悟、思考等,可选)

??转眼间,开学也已经快一个月了,又找到了上学期学习的感觉,但由于中秋假期的影响,还是感到自己这周的学习时间不太够,仅仅只完成了教材内容和代码练习而已,并没有去进行更多的拓展学习。我能感到自己状态有所好转,能够静下心来认真看书,专心敲代码了,但还是要付出更多的时间才行,继续加油!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
第一周 200/200 1/1 5/20
第二周 981/1181 1/2 15/20
第三周 1694/2875 1/3 15/35
  • 计划学习时间:15小时
  • 实际学习时间:15小时

参考资料

补充作业

  • 感觉自己在软件实现和软件测试上只是略懂一二,还有很多不会的、不明白的需要学习。效能分析和需求分析也仅仅是接触的程度而已,至于下面的行业洞察力,项目管理,软件设计等一系列的东西则了解的更是少之又少。对照了这个表,深感自己的学习程度不够,学习时间不足,还需要付出更多的精力和更大的努力才行
目前水平 (0~9) 课程结束后水平 (0~9)
对编程总体理解 3 8
程序理解 5 8
模块实现,逐步细化 2 7
单元测试,代码覆盖率 4 8
代码质量 6 8

原文地址:https://www.cnblogs.com/yu-kunpeng/p/9700281.html

时间: 2024-10-09 21:27:32

20172313 2018-2019-1 《程序设计与数据结构》第三周学习总结的相关文章

《程序设计与数据结构》第九周学习总结

学号 20172326 <程序设计与数据结构>第九周学习总结 教材学习内容总结 图:图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的.与树的区别在于树中的一个结点只有一个前驱,也就是说只有一个父结点.但图中的顶点(结点)是没有这种限制关系的. 无向图:边为无需结点对的图.也就是说,现有两个顶点A.B.(A,B)与(B,A)效果相同.当两个顶点之间有边连接,也就是说这两个顶点是邻接的,也称作邻居.一个顶点

20172305 2017-2018-2 《程序设计与数据结构》第一周学习总结

20172305 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 本书的第一章简单的介绍了计算机和JAVA的历史,基础内容很多,代码的讲解还没用正式进入,本周一直在做敲代码的准备,简单敲了老师给的"Hello World!"以及书后的PP1.3.PP1.4等简单的小程序. 教材学习中的问题和解决过程 问题1:三种不同类型的错误,运行错误和逻辑错误的混淆 问题1解决方案:针对EX1.20的"希望做加法时却做里乘法"进行了网上

20172314 2017-2018-2 《程序设计与数据结构》第一周学习总结

20172314 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 本书第一章为计算机系统概述,前面是一些计算机相关的基础知识,让我对计算机有了一个总体的认识,不再是一片空白了,对主存储器和CPU影响深刻,主存储器用于保存程序和数据,CPU执行程序指令.在接下来的Java编程语言与程序开发部分,开始看的时候有点迷茫,不是很理解,后来先按照作业中附带的流程完成一些代码托管之后,接触了完整的简单的程序之后,再回过头来看书,看到的一些陌生的名词在脑海中就有了实际的对应,

20172317《程序设计与数据结构》第一周学习总结

20172317 2017-2018-2 <程序设计与数据结构>第一周学习总结 教材学习内容总结 重新温习了一遍计算机的基础 总算了解了局域网广域网因特网万维网这些东西之间的区别了 通过URL的例子知道了网址各个部分的含义 对Java编程语言和程序开发有了一个粗浅的了解 教材学习中的问题和解决过程 问题:练习题SR1.13出现了答案与题目不相符的情况 问题解决方案:题中有个选项是"网卡",答案中没有,反而有个题目没有的选项"调制解调器"(俗称"

20172322 2017-2018-2 《程序设计与数据结构》第二周学习总结

20172322 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 了解了print与println的区别 了解了字符串的拼接可以用+来完成 了解了转义字符的使用 学会了使用赋值 学会使用部分算术运算符 学会了使用Scanner来实现交互性 教材学习中的问题和解决过程 问题1:在最初接触赋值时对foalt和double的赋值范围不了解 问题1解决方案:使用万能的度娘后看到一个高赞答案后有了了解 问题2:在提前预习时看到2.7图形后敲入的代码无法执行 问题2解决方案

20172328《程序设计与数据结构》第二周学习总结

20172328李馨雨<程序设计与数据结构>第二周学习总结 又到周五,李馨雨同学要开始写博客了.让我们开始吧!(????) 教材学习内容总结 1.首先是String类定义的字符串,然后是print和println的区别.转义字符的学习.(让我印象深刻的\b[回车符]在字符串结尾不显示哈哈,及其更新的\t[换行符],还有在课堂上真正明白了什么是回车.) 2.了解变量.常量.赋值语句.变量:保存数据的内存单元.常量:坚定自己不会变的数据!除非你用java的反射(有点复杂,改权限.去修饰符等等.没实

20172327 2017-2018-2 《程序设计与数据结构》第二周学习总结

20172327 2017-2018-2 <程序设计与数据结构>第二周学习总结 教材学习内容总结 字符串的拼接和转义序列的使用 变量的声明和使用 讨论语法及表达式的处理 定义数据转换类型和实现类型转换的机制 创建Scanner类 教材学习中的问题和解决问题 暂无 代码学习中的问题和解决过程 问题1:在提交过程中,突然遇到无法上传的情况 问题2解决方案:通过上网查找,输入git pull之后弹出一个编辑框,选择关闭之后,再次用git push就成功了. 问题2:在按照例题2.10打代码时,Jav

学号20172328《程序设计与数据结构》第九周学习总结

学号20172328<程序设计与数据结构>第九周学习总结 教材学习内容总结(异常和递归) 第11章:异常 1.[异常处理]: 一个异常:是一个定义非正式情况或错误的对象,由程序或者运行时环境抛出,可以根据需要捕获和处理. 错误:错误类似于异常,但是错误代表不可恢复的问题并且必须捕获处理. 2.[处理异常的三种方法]:①根本不处理异常②当异常发生时处理异常③在程序的某个位置集中处理异常. 3.[未捕获的异常]:如果程序中不处理异常,则程序将非正常的终止运行,并产生关于描述在何处发生什么异常的信息

20172326 《程序设计与数据结构》第九周学习总结

学号 20172326 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常(exception):定义非正常情况下或错误的情况的对象,由程序或运行时环境抛出,可根据需要进行相应的捕获处理. 异常与错误的区别:错误代表不可恢复的问题并且必须捕获处理.而异常可以忽视,或者使用try语句处理,或调用更高级的方法. 可检测异常与不可检测异常:可检测异常必须由方法捕获,或者必须在可能抛出或传递异常方法的throws子句中列出来.在方法定义的声明头中追加一条throws子句.不可检测异常不需要使

20172322 2017-2018-2 《程序设计与数据结构》第九周学习总结

20172322 2017-2018-2 <程序设计与数据结构>第九周学习总结 教材学习内容总结 异常 学会了使用try-catch来实现未捕获的异常的处理.可以使得异常被捕获进而不导致程序出现错误退出.使用try写入可能产生异常的语句,使用catch来编写在捕获异常后继续执行的代码(可以为空). "未捕获的异常"指在编译过程中不会被编译软件显示异常但是在运行时会出现异常导致程序直接退出,例如:"ArithmeticException"."In