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

Posted pframe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172303 2018-2019-1 《程序设计与数据结构》第2周学习总结相关的知识,希望对你有一定的参考价值。

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

教材学习内容总结

第3章 集合概述————栈

一、集合

  • 定义:一种聚集、组织了其他对象的对象
  • 集合的分类
    • 按保存的类型分:
      • 同构:集合中保存的类型全部相同。
      • 异构:集合中可以保存全部的类型。
    • 按组织的方式分(组织形式由元素添加到集合的次序或元素自身之间的一些内在关系):
      • 线性集合:集合中的元素按直线方式组织。如:队列集合、栈集合。
      • 非线性集合:集合中的元素不按直线方式组织。如:树集

二、抽象数据类型(Abstract Data Type, 简称ADT)

  • ADT是一种在程序设计语言中尚未定义其值和操作的数据类型。
  • ADT的抽象性:ADT要对其实现的细节进行定义,而这些定义对于用户是不可见的。
  • 集合是由对象创建的,对象的内部对于系统其它部分来说是封装的,因此集合是一种抽象数据类型

三、泛型

  • 定义:一种可以存储、操作和管理在实例化之前没有指定类型的对象的一个类,通常用作为标识符。
  • 泛型不能被实例化,它只是一个占位符,允许我们去定义管理特定类型的对象的类。

四、栈

  1. 栈的相关概念
  • 栈是一种线性数据结构,采用后进先出(Last in,first out。简称LIFO)的方法处理元素
  • 栈的一般方法:
    技术分享图片
  1. 栈集合
  • Java集合框架中的Stack继承自Vector:
    • 由于Vector有4个构造函数,加上 Stack本身的一种,也就是说有5种创建Stack的方法
    • 跟Vector一样,它是数组实现的栈。
  1. 栈ADT
    技术分享图片

第4章 链式结构————栈

一、链式结构

  • 定义:一种使用对象引用变量来创建对象之间的链接的数据结构。
  • 对象引用变量
    • 对象引用变量存放的是对象的地址,表示对象的存储位置。
    • 通常而言,对象引用变量存放的地址是无关紧要的,其最重要的目的是用于访问对象。

二、链表

  • 定义:链表是链式结构的一种。(链表≠链式结构)
  • 类型:单链表、双向链表、循环链表
  • 在链表中,对象引用变量也可称为指针,链表中存储的对象泛称为结点。
  • 结构:
    • 链表需要一个单独的引用变量来作为链表的首结点。
    • 同时,链表需要一个从一个对象到另一个对象的引用变量,又称作自引用的,通常用next来定义。
    • 链表终止于其next引用为空的结点。

三、管理链表

  • 访问元素:访问元素的唯一方法是从第一个元素开始,遍历整个链表直至找到所需元素。
//以Person类为例
Person current = first;
for(int i = 0; i < n(指定整数);i++){
    current = current.next;//遍历列表
}
  • 插入结点:插入结点需要先设置一个临时的结点用来防止指针丢失,改变引用顺序是其关键
//以上课时讲的Student类为例
public static void InsertNode(Student head,Student node1,Student node3){
        Student point = head;
        while((point.number != node1.number) && point != null){
            point = point.next;
        }
        if (point.number == node1.number){
            //此处的两句绝对不能够换位置,不然可能会造成NullPointerException
            node3.next = point.next;
            point.next = node3;
        }
    }
  • 删除节点:只要使被删除结点的前一个指针指向被删除结点的后一个指针即可。
//仍然以Student类为例
public static void DeleteNode(Student head,Student node){
        Student pre = head, current = head;
        while (current != null){
            if (current.number != node.number){
                pre = current;
                current = current.next;
            }
        }
        pre.next = current.next;//关键步骤
    }
  • 无链接的元素:结点存放的只是存储位置,要访问链表中存储的实际元素时最好使用结点对象中的单独引用来访问。

集合栈与链表栈的比较

  • ArrayStack是基于动态数组的数据结构,LinkedStack基于链表的数据结构。
  • 对于随机访问和改变操作集合中的元素,ArrayStack要优于LinkedStack,因为LinkedStack要移动指针。
  • 对于新增和删除操作,LinedStack比较占优势,因为ArrayStack要移动数据。但这一点要看实际情况的。若只对单条数据插入或删除,ArrayStack的速度反而优于LinkedStack。但若是批量随机的插入删除数据,LinkedStack的速度大大优于ArrayStack。因为ArrayStack每插入一条数据,要移动插入点及之后的所有数据。

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

  • 问题1:有点不是很明白javadoc的用法以及作用,和使用//或/**/有什么区别
  • 问题1解决方案:Java中有三种注释方式。
    • 前两种分别是//和/**/ ,主要用于代码的注释,以此来方便代码的可读性。
    • 第三种被称作说明注释或文档注释,它以 /** 开始,以 */结束,文档注释允许你在程序中嵌入关于程序的信息,有了这个注释就可以使用 javadoc 工具软件来生成信息,并输出到html文件中。
    • 除此之外,我找到一篇博客说明了如何生成javadoc的方法:如何使用javadoc
  • 问题2:书上提到52页提到的哨兵结点和哑结点是什么?
  • 问题2解决方案:如果我们把第一个节点的prev指向最后一个节点,而把最后一个节点的next指向第一个节点,这样就形成了一个双向循环链表。哨兵结点是个哑元节点,可以简化边界条件,使代码更紧凑,但对速度并没有什么帮助。在基于双向循环链表的实现中,可以设置一个哑元节点。这个节点,起哨兵的作用。也就是说它们并不存储任何实质的数据对象。初始时可以将哑元节点的next指向第一节点,prev指向最后一个节点。

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

  • 问题1:在做PP3.8时,每次最后显示的结果都缺最后一个。
    技术分享图片
  • 问题1解决方案:通过多次测试发现不是只缺最后一个,而是缺一部分,通常是一半,后来发现是for循环内的条件有问题,修改后就能够显示所有元素了。
    技术分享图片

代码托管

上周考试错题总结(正确为绿色,错误为红色)

  • 错题1:Software that is easily portable, can be moved from one computing environment to another with little or no effort.
    • A .True
    • B .Flase
  • 原因及理解情况:高质量的软件一般要具有可移植性,所以当时我觉得不是说只要是软件就可以随意移植,还是需要一些修改的。但是现在发现是因为当时没有看到“little"的原因。
  • 错题2:An efficient system handles problems gracefully
    • A . True
    • B . False
  • 原因及理解情况:质量特征和描述不匹配,能恰当的解决问题是软件的健壮性而不是运行效率。
  • 错题3:Software systems need only to work to support the work of developers, maintainers, and users.
    • A . True
    • B . False
  • 原因及理解情况:当时看到这道题的时候其实我不是很确定,但是看到在书的第7页有这样一段话:

    软件系统必须经过精心设计、编码和文档说明,以便为开发人员、维护人员和用户提供支持。

  • 当时看完之后就觉得好像除了这三种人也没有其他的了,但是查了查发现还有系统管理员之类的角色存在。

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • 优点:相较上周在博客内容方面有所改进,望继续努力。
    • 问题:博客还是图文并茂好一些,这样自己或者别人都看得舒服一些_(:з」∠)_ 对于代码运行中的问题的整个过程的记录希望可以更详细一些。
  • 代码中值得学习的或问题:
    • 优点:代码相比我的更加简洁,命名更加规范。
    • 问题:commit相比上学期写的不是很好。

      点评过的同学博客和代码

  • 本周结对学习情况
    • 20172322
    • 结对学习内容
      • 主要讨论了蓝墨云的课堂实践内容,对于用链表实现插入和删除的功能进行了深入地探讨。

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

  • 感觉本周的课本内容不是很条理,总觉得书上的内容东一块西一块的,写教材总结的时候也感觉很没有感觉,找不到条理的方法和顺序来总结。而且因为课上实践做的不是很好有点受挫,继续加油吧。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/1 10/10
第二周 246/366 2/3 20/30
  • 计划学习时间:15小时

  • 实际学习时间:20小时

  • 改进情况:链表真skr磨人的小妖精...废了我半本草稿本

参考资料

以上是关于20172303 2018-2019-1 《程序设计与数据结构》第2周学习总结的主要内容,如果未能解决你的问题,请参考以下文章

20172303 2018-2019-1 《程序设计与数据结构》第5周课堂实践报告

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

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

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

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

20172303 2018-2019-1 《程序设计与数据结构》第2周课堂实践修改报告