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

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

教材学习内容总结

本周学习了第三章集合概述——栈和第四章链式结构——栈
第三章定义了与集合相关的概念与术语,讨论了集合的抽象设计以及继承、多态性、泛型和接口等多项问题,最后通过栈这一集合展示了与集合设计、实现和使用等有关的问题。
第四章学习了一种创建数据结构的技术,利用引用来创建对象之间的链接

3.1 集合

这一节主要在讲与集合相关的概念和术语,有一些概念比较难以理解。

  • 集合是一种聚集、组织了其他对象的对象。
  • 集合可以分为线性集合和非线性集合(从某种程度上,非线性集合也许根本就没有任何组织形式)
  • 集合中元素通常是按它们添加到集合的顺序或者是按元素之间的某种内在关系来组织的。
  • 抽象数据类型
    • 抽象能隐藏某些细节。而集合隐藏了其的某些细节并定义了一些接口操作,用户可以通过这些接口操作管理集合中的对象。因此集合是一种隐藏了实现细节的抽象。
    • 数据类型是一组值及作用于这些数值上的各种操作
    • 抽象数据类型(ADT)是一种在程序设计语言中尚未定义其值和操作的数据类型。
    • 数据结构是一种用于实现集合的基本编程结构

3.2 栈集合

  • 栈的元素是按后进先出的方法进行处理的,最后进入栈中的元素最先被移出

3.3 主要的面向对象概念

  • 继承与多态性
  • 泛型:可以定义一个类,它可以在存储、操作和管理在实例化之前没有指定是何种类型的对象。因此,任意类型的对象都可以存储在这个类中。如
class Box<T>//用于管理类型T的对象的声明和代码
Box<Widget> box1 = new Box<Widget>//变量box1的类型为Box<Widget>

3.6 栈ADT

  • Java接口定义了一个抽象方法集,有助于把抽象数据类型的概念与其实现分隔开来
  • 通过接口名作为返回类型,方法就不会局限于实现栈的任何特定类

4.1链接作为引用

  • 对象引用变量可以用来创建链式结构
  • 链式结构是一种数据结构,它使用对象引用变量来创建对象之间的链接,其中的一个对象可以指向另一个对象,从而在链表中创建一个对象的线性次序。在链表中存储的对象通常泛称为该链表的结点(node)。

4.2管理链表

  • 访问元素
Person current = first;
for (int i = 0; i < 3; i++){
    current = current.next;
}

这种方法可以访问指定位置的结点元素。在循环中,需要定义使用“current”指针而不是“first”指针,否则一旦first指针指向第二个元素,就没有指向第一个的指针了,于是第一个结点将无法被访问。

String searchstring = "Tom Jones";
Person current = first;
while ((not(current.equals(searchstring)) && (current.next != null)
current = current.next;

这种方法可以访问指定内容的结点。

  • 插入结点:改变引用顺序是维护链表的关键

  • 删除结点

  • 无链接的元素
    - 定义一个单独的结点类,将所有元素链接在一起
    - 双向链表

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

  • 问题1:抽象数据类型(ADT)的理解
  • 问题1解决方案:读完教材上关于ADT的一些解释,还是对这一概念比较的模糊。首先,数据类型是一组性质相同的值的集合以及定义在此集合上的一些操作的总称;抽象是指抽取出事物具有普遍性的本质。它是抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括。抽象是一种思考问题的方式,它隐藏了复杂的细节,只保留了实现目标所必须的信息。把这两个概念结合一下,抽象数据类型是一种在程序设计语言中尚未定义其值和操作的数据类型。用实例来展示抽象数据类型,就比如用线性表描述学生成绩表,用树或图描述遗传关系。

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

  • 问题1:PP3.2的题目中,如何反向显示每个词的字符以及正确理解
  • 问题1解决方案:
    • 一开始读题时,我的理解是句子中单词的顺序不变,但每个词的字母顺序颠倒。比如“Pink Floyd”颠倒后成为“kinP dyolF”。但后来与同学的交流中,好像是自己理解过度了,可能只是颠倒一下单词顺序就行了,结果应该是“Floyd Pink”。两个似乎都有道理,所以我两个都做了一遍。
    • 因为是要用数组来表示栈,上学期做中缀转后缀的实验时运用了一个“split”的方法,它可以将句子按特定的方式分隔开存入数组中。实现第一种时,我使用了内外两层循环,先将一个句子按空格分割把每一个单词分别存入数组中,再将单词挨个颠倒字母顺序再进行输出拼接。实现第二种就很简单,将每个单词存入数组再反向输出即可。
  • 问题2:蓝墨云测试活动中遇到的一些问题,详见博客

代码托管

上周考试错题总结

  • 错题1:Software systems need only to work to support the work of developers, maintainers, and users.
    A .True
    B .Flase
  • 错题2:Which of the following has the smallest time complexity?
    A .3n+5+2n
    B .logn+2
    C .3n+4
    D .nlogn
  • 解析:这是要找最小时间复杂度。根据下图,可知logn是最小的。

结对及互评

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

    • 内容充实,各方面都很详细
    • 课程学习中有自己的思考,很能启发我学习的灵感
  • 基于评分标准,我给谭鑫的博客打分:5分。得分情况如下:
    正确使用Markdown语法(加1分):
    模板中的要素齐全(加1分)
    教材学习中的问题和解决过程, 一个问题加1分
    代码调试中的问题和解决过程, 一个问题加1分

  • 基于评分标准,我给方艺雯的博客打分:5分。得分情况如下:、
    正确使用Markdown语法(加1分):
    模板中的要素齐全(加1分)
    教材学习中的问题和解决过程, 一个问题加1分
    代码调试中的问题和解决过程, 一个问题加1分

点评过的同学博客和代码

其他

这周的学习怎么说呢,是自我感觉良好,看见同学们写的博客以及代码作业,真是有些相形见绌、自愧不如的感觉。比如蓝墨云的作业就是审题不仔细加上课堂上也没有完全弄懂,导致最终事倍功半。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 8/8
第二周 470/470 1/2 12/20

参考资料

posted @ 2018-09-18 19:57  二许  阅读(205)  评论(0编辑  收藏  举报