20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结
20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结
教材学习内容总结
本周内容主要为书第三章和第四章的内容:
-
第三章(以数组来替代栈的作用)
- 集合(聚集,组织了其他对象的对象):
- 线性集合(直线方式组织的集合)
- 非线性集合(某种非直线方式组织的集合)
- 抽象数据类型是一种在程序设计语言中尚未被定义其值和操作的数据类型。
- 数据结构是一种用于实现集合的编程结构集。
- Java集合API是一个类集,表示了一些特定类型的集合。
- 栈
- 线性集合
- 后进先出(LIFO)
- 栈的基本使用就是用于颠倒顺序
- 面向对象的三个基本特征是:封装、继承、多态
- 封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。(private、public、protected三者的可见性)
- 继承,从现有类派生新类的过程,无需重新编写原来的类的情况下对这些功能进行扩展,一种强有力的软件开发技术。(extends与super,通过继承可形成类的层次结构)
- 多态,允许将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。即允许将子类类型的指针赋值给父类类型的指针。(覆盖与重载)
- 泛型保证了集合中对象类型的兼容性。是一种参数化类型的机制。它可以使得代码适用于各种类型,从而编写更加通用的代码。泛型是一种编译时类型确认机制。它提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。
- 错误和异常表示的是不正常或不合法的处理。
- Javadoc可用于创建关于类集的在线HTML文档。任何程序或类集的文档都可以使用Javadoc来生成,是为java代码添加注释的官方标准。
- @author标签用于标识编写代码的程序员
- @version标签用于指定代码的版本号
- @return标签用于表明由该方法返回的值
- @param标签用于标识传递给该方法的每个参数
- 集合(聚集,组织了其他对象的对象):
-
第四章(以链表替代栈的作用)
- 链式结构是一种数据结构,使用对象引用变量来创建对象之间的链接。
- 引用变量又称为指针
- 单向链表与双向链表
- 单向链表是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。
- 双向链表是链表的一种,其中的每个结点都具有指向该链表中下一个结点和上一个结点的引用。
- 链表中存储的对象通常泛称为该链表的结点。
- 程序栈(运行时栈)用于跟踪被调用方法。每次调用一个方法时,就会创建一个表示该调用的调用记录,并压入到程序栈中。
- 调用记录:一个对象,表示一个方法的调用。
- 哨兵结点是位于链表前端或末尾的结点,起标识符的作用,不表示链表中的某个元素。
教材学习中的问题和解决过程
-
问题1:数组与链表替代栈,两者的优缺点?
-
问题1解决方案:数组和链表在一定程度上都可以表示栈的push、pop、peek等方法,但是数组有容量需要确定的长度大小,而链表没有容量限制。数组利用索引能提供对元素的直接访问,而链表必须依次遍历元素才能到达其中的某个结点。通过课后的编程项目以及网上的查找可以看出两者有不同的优缺点:
- 数组
- 优点:随机访问性强(通过索引可以快速定位)、查找速度快
- 缺点:插入和删除效率低(插入和删除需要整体移动数据)、可能浪费内存(因为是连续的,所以每次申请数组之前必须规定数组的大小,如果大小不合理,则可能会浪费内存)、内存空间要求高,必须有足够的连续内存空间。数组大小固定,不能动态拓展。
- 链表
- 优点:插入删除速度快(因为有next指针指向其下一个节点,通过改变指针的指向可以方便的增加删除元素)、内存利用率高,不会浪费内存(可以使用内存中细小的不连续空间,并且在需要空间的时候才创建空间)、大小没有固定,拓展很灵活。
- 缺点:不能随机查找,每次查找必须从第一个开始遍历,查找效率低。
可以看出,链表的优点就是数组的缺点。对于替代栈的方法在代码中遇到的问题中会具体说明。
-
问题2:单向列表与双向列表
-
问题2解决方案:单向链表的每个结点有一个next引用指向链表的后续结点,双向链表的每个结点存储着一个next引用和一个previous引用。双向链表的双向引用可以使两
端既为头又为尾,适用于复杂的集合排列。 -
问题3:使用哨兵结点的优点
-
问题3解决方案:有哨兵结点的对于具体方法的使用可以简便,但需要额外的一个结点。
- 带哨兵节点的链表,需要额外的一个节点,但插入和删除等操作不需要额外的判断;不带哨兵节点,在处理链表为空时,和其他情况不一样,需要单独判断一次。
- 带哨兵节点的链表,插入或删除时,不论操作的位置,表头都不变,不需要额外的判断;不带哨兵节点的链表,插入或删除操作发生在第一个节点时,表头指针都要变化,需要额外的处理。
代码学习中的问题和解决过程
- 问题1:类LinkedSet
和ArraySet 有哪些相同与不同? - 问题1解决方案:LinkedSet
和ArraySet 都实现了SetADT 接口,都代表了栈,提供了使用Stack所需的必要操作。从用户角度来看,功能上是可以互换的,但是每一个具体方法内部的运行是不同的,ArraySet 运用的是数组来实现的,LinkedSet 运用的是链表来实现的。
-
问题2:push、pop、peek、isEmpty、toString方法的实现
-
问题2的解决方案:
- push:添加一个元素到栈的一端
- 数组:先判断数组是否已满,未满的情况下可以直接插在下一个可用位置,满的条件下可以进行扩容,在插入可用位置即可。
- 链表:创建新结点,含有一个引用,指向要放置到栈中的对象。把原链表末尾的结点指向新元素,新结点的next引用设置为指向当前栈顶。
- pop:从栈的前端移出一个元素
- 数组:在确保栈中至少有一个元素的前提下返回索引值为存入内容的数组空间数 - 1(索引值从0开始)的元素,令其等于null。
- 链表:在确保栈中至少有一个元素的前提下进行循环(通过
next == null
的条件)找到链表尾部元素,在倒数第二个元素的结点上令其next == null
即可。
- peek:返回一个指向栈的前端元素的引用
- 数组:返回索引值为存入内容的数组空间数 - 1(索引值从0开始)的元素。
- 链表:进行循环(通过
next == null
的条件)找到链表尾部元素进行输出。 - peek与pop的区别就是在于对栈顶元素的查看和移除。
- isEmpty:如果栈为空返回真,否则返回假
- 数组:判断索引值为0的位置是否为空,或是判断栈的元素计数器top变量是否为0。
- 链表:判断链表的头位置是否为空,或是判断栈的元素计数器count变量是否为0。
- toString:
- 数组:从索引值最大的位置开始不断缩减索引值并进行输出。
- 链表:从链表的尾部开始往头部进行不断输出。
- 直接用Stack.toString()就是从栈底往栈顶输出,而不是从栈顶往栈底输出,所以我用数组和链表替代栈的时候都改为从栈顶到栈底。
- push:添加一个元素到栈的一端
- 问题3:PP3.2与PP3.8题目理解,元素顺序?
- 问题3解决方案:最初这两个编程项目其实很简单,用个Stack就好了,结果在周五上课之前就编完了。结果老师说用
数组来替代栈,还得重新编!。3.2与3.8的要求在刚开始觉得就是一个要求,觉得元素集不就是一个个字符么?元素集的含义没搞懂,其实3.2的要求是针对一个字符串的每一个字符的顺序,I love you !
就应该是! uoy evol I
而3.8的要求是针对集合中的每一个元素{one,two,three}
就应该是{three,two,one}
。3.2用了charAt()方法,3.8StringTokenizer方法。在实现的基础上我用了上学期的一个示例代码,加了一个循环。(3.8我觉得元素集之间的间隔符号不一定是空格或是逗号,所以我采用可以使任意一个符号都可以。)- 3.2用栈编写
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915195723833-1176593501.png"width="70%"height="70%"/> - 3.2用数组编写
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915202118383-1077416911.png"width="70%"height="70%"/> - 3.8用栈编写
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915195739987-1446868352.png"width="70%"height="70%"/> - 3.8用数组编写
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915202338823-1247537564.png"width="70%"height="70%"/>
- 3.2用栈编写
- 问题4:PP3.9数组扩容问题和使用Android Studiode
- 问题4解决方案:这个编程项目上学期就做过类似的代码,只不过运用的是运算式“加减乘除”进行运算的,所以这个不难。但是之前的都是给出长度大小的,而这个是一个一个往里面添加字符串的,不确定加多少。所以,需要编写一个方法,在数组容量满的时候可以进行扩容,上学期有一个示例代码就是解决这个问题的。算是借鉴了,示例代码总是在数组们的条件下进行翻倍的扩容,这样开辟了大量的内存空间,降低效率,所以我在此基础上进行改写,在数组容量满的情况下开辟一个容量空间,每次都会剩下一个空间。在保证数组空间未满的情况下,有保证了不浪费内存空间。在实现的基础上我有又使界面变得更加人性,在空栈的情况下添加了一个Toast,进行提醒,又给图标换了我最喜欢的复仇者联盟。哈哈~~~~
- 压入栈
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915200726908-1805460091.png"width="40%"height="40%"/> - 弹出栈
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915200900863-1642314469.png"width="40%"height="40%"/> - 显示内容
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915201004939-30463409.png"width="40%"height="40%"/> - 扩容
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915201047098-904165528.png"width="40%"height="40%"/> - 结果
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915202835695-316756644.jpg"width="30%"height="60%"/>
<img src="https://img2018.cnblogs.com/blog/1333004/201809/1333004-20180915202934512-1468474758.jpg"width="30%"height="60%"/>
- 压入栈
- 问题5:PP4.2题目理解
- 问题5的解决方案:编程项目4.2做的很混乱,开始陷入找postfix程序,在第三章根本没有这个程序。后来以凭感觉找出来了,但是根据问题题意(可能最近学离散的关系)但是那个PostfixTester和PostfixEvaluator也没用到ArrayStack
,直接就是用栈stack。后来尝试用链表进行改写,才发现书上有那个push和pop的相关内容。所以很轻松就解决4.2的问题。
代码托管
-
不小心把上学期的代码都算上,实质只写703行代码(自行计算得出)。
上周考试错题总结
- 错题1:An efficient system handles problems gracefully(一个高效的系统可以完美地处理问题)
- A.true
- B.false
- 错误解析:高效的系统是可以充分的利用CPU时间和内存,软件的质量特征中的健壮性是指可以恰当处理的程度。
-
新学期第一次考试,又是全英文的考试题,(。•́︿•̀。)好在题目不是很难,就错了一道题。而且全过程遇到了几道不是很确定的题目,尽管对了,但还是不够清楚。看来前两章看的不过细致,争取以后的考试也能像这次的一样就好。此外,以后也要争取尽量不用有道来翻译!
结对与互评
点评(王禹涵)
- 博客中值得学习的或问题:
- 博客中对于链表的内容的解释插入图片进行理解。
- 代码中值得学习的或问题:
- 合作探讨代码问题。
- 基于评分标准,我给本博客打分:7分。
- 得分情况如下:
- 正确使用Markdown语法(加1分)
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 一个问题加1分
- 代码调试中的问题和解决过程, 二个问题加2分
- 感想,体会不假大空的加1分
- 点评认真,能指出博客和代码中的问题的加1分
点评(方艺雯)
- 博客中值得学习的或问题:
- 图片运用恰当,很清晰的解释了问题和相关内容,第三章和第四章总结的特别详细
- 基于评分标准,我给本博客打分:8分。
- 得分情况如下:
- 正确使用Markdown语法(加1分)
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 二个问题加2分
- 代码调试中的问题和解决过程, 二个问题加2分
- 感想,体会不假大空的加1分
- 点评认真,能指出博客和代码中的问题的加1分
互评对象
-
本周结对学习情况
20172314方艺雯
20172323王禹涵 -
结对学习内容:数组和链表来替代栈
感悟
终于开始编写项目了,好恐怖!!!还有课堂测试,好在第三章和第四章讲述的都是自己熟悉的内容,还有上学期的代码的加持,还是很顺利的度过了。整体来看第三章和第四章的内容,无论是用数组表示栈,还是用链表表示栈都是理解数组和链表的操作就好。相对比,自己的链表还不是像数组一样应用自如,还是要在链表的相关知识点进行理解!!在考试的部分又看到和上学期一样的不足,需要有道的帮助,本学期还有可怕的四级考试,看来我的英语之路,任重而道远了。加油,下周又是元气满满的一周(ง •̀_•́)ง!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 15/15 | |
第二周 | 703/703 | 1/2 | 20/35 |