20182334 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结
教材学习内容总结
本周学习了栈的数组表达和链表表达和队列的数组表达和链表表达,无论是数组还是链表,都离不开一个接口,叫做ADT:
public interface StackATD<T>
{
public void push(T element);
public T pop();
public T peek();
public boolean isEmpty();
public int size();
public String toString();
}
public interface List<T> {
public void add( T element);
public T delete();
public T first();
public boolean isEmpty();
public int size();
public String toString();
}
这两段代码起到中枢作用,承接栈的所有方法,也联系着测试代码。
同样在队列中也是如此,需要同样的接口。
栈相当于做电梯,先进的人后出,后进的人先出;队列就相当于我们一般的排队,先排的人先走,后排的人后走。
还学习了时间复杂度,在我理解看来,时间复杂度就是观察代码中有几层循环,有几层循环就有几个n,最后得到结果。
在学习过程中,关于队列用数组形式表达出来会出现查找问题,那这时候会出现不知道如何找到,这里我接触到也学到了哨兵这一知识点,并了解其作用。
教材学习中的问题和解决过程
-
问题1:老师介绍的时间复杂度我还是没有搞透。
-
问题1解决方案:自己搜索资料发现一篇博客一套图 搞懂“时间复杂度”,在这篇博客里讲的很详细,例如常见的四种时间复杂度:O(1)、O(logn)、O(n)、O(n^2),究竟谁用的时间更长,谁更节省时间?
-
问题2:还是没搞懂泛型到底是用来干啥的。
-
问题2解决方案:找博客java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一,这篇博客讲的很详细,我读了一遍后,大致有了一些明白:就是在命令行输入数据时,有可能前后输入两次的数据类型不同,这时在运行编译时会报错,很崩溃,那这时候泛型就体现出它的作用,可以提前定义一种类型,当在敲代码的过程中出现两种不同的类型时,会显示错误,这时就可以及时并准确的改正,带来方便;并且在方法里很多数据也都是用泛型定义的,在我理解看来是具有很强的灵活性,当时String时整体都是String,当是Int时整体都是Int。
-
问题3:在用后缀表达式计算表达式时,会出现疑问,为什么(3 * 4 - ( 2 + 5 )) * 4 / 2 转化为后缀表达式时是3 4 * 2 5 + - 4 * 2 / 而不是 3 4 * 2 5 + - 4 2 / * 。
-
问题3解决方案:问了老师,同时自己也思索了一会,才明白计算机和人不一样,计算机是按照顺序一个一个输入输出的,而人是用自己一眼看过去觉得最简单的方法计算的,所以会产生差异。
-
问题4:在栈里插入元素不是很清楚用链表怎么查,总会出现指针后的数据全部丢失。
-
问题4解决方案:关于这一问题,老师上课也讲到了,首先让新元素的next指向链表目的head,之后再让head指向新元素,这时候把所有元素都保留下来了,也没出现我所说的丢失数据的情况。
代码调试中的问题和解决过程
-
问题1:在下图中,用泛型定义的数组在实例化时出现问题。
-
问题1解决方案:在 仔细研究了泛型之后,发现在整个实例化之前加T[]就可以使数组实例化,很神奇,也让我学到了。
- 问题2:在IDEA里用文件写入我又忘记了。
- 问题2解决方案:上网找资料并且找之前打过的代码,发现以下代码:
try {
//将集合数据写入磁盘
FileWriter fw = new FileWriter("D:\IDEAAAA\untitled5\Week8\List_practice\title.txt");
for (String s : list) {
fw.write(s);
fw.write("
");
}
fw.close();
//读取磁盘上文件数据
BufferedReader br = new BufferedReader(new FileReader("D:\IDEAAAA\untitled5\Week8\List_practice\title.txt"));
String line;
//将读取到的数据写入到list集合中
List<String> list1 = new ArrayList<String>();
while ((line = br.readLine()) != null) {
list1.add(line);
}
//StringBuilder sb = new StringBuilder();
String pp = "";
/*while ((pp = br.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格
sb.append(pp +"
");
}*/
//循环输出list集合
String s = list1.toString();
pp = s.substring(1,s.length()-1);
//System.out.println(pp);
br.close();
以上代码是读写都有,主要是FileWriter、BufferedReader、substring这些方法的含义都忘记了,所以又重新打开JDK API 找各种方法。
-
问题3:在从文件读入的过程中,不知道如何将char类型转化为Int类型。
-
问题3解决方案:试了试强转换,在数据前加了Int,但是0会变成49,还是不行,这时我 再上网找,发现要是加个 -'0' 则会变成1,可能是在char类型中直接运算会直接变成char类型。
-
问题4:在做排序时,出现很大问题,因为是用链表做,有很多不懂得地方。
-
问题4解决方案:先放图:
上面这张图是冒泡排序,和C语言差不多,整体框架都是一样的,有两个循环不同的是,这个是链表,而C语言是数组,我感觉,链表要比数组难很多,毕竟当时没有学链表,所以现在感觉有一点吃力,但当全部学完之后,回过头发现自己的努力没有白费。用链表实现的具体方法是:利用head、next和data将所有元素连接起来,形成一个链,一定注意链表里的元素数据要交换一定要找第三个变量,并且要用同类型的,不能混用,否则一定报错,吃过很多亏。
代码托管
上周考试错题总结
上周无考试
点评过的同学博客和代码
其他(感悟、思考等)
java和数据结构的学习强度已经超过我最开始的想象了,看来我还是低估了他俩合起来的威力。老师最开始说有没有信心打6000行代码,我觉得打20000行都有可能。96学时将上一届学长学姐学的内容全部讲完还要全部消化,这本来就是很大的挑战,再加上自己充实的自学时间,让自己把所有时间都用在了java上,感觉很亏,但不得不学。总感觉学校安排的课程有问题,自己完全不能接受关于java的排课,真的接受不了。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 212/212 | 2/2 | 17/17 | |
第二周 | 132/344 | 2/4 | 17/34 | |
第三周 | 689/1033 | 1/5 | 23/67 | |
第四周 | 664/1697 | 2/7 | 20/87 | |
第五周 | 586/2283 | 2/9 | 20/107 | |
第六周 | 500/2783 | 1/10 | 26/133 | |
第七周 | 2143 /4928 | 2/12 | 40/173 |
-
计划学习时间:29小时
-
实际学习时间:40小时
-
改进情况:不妥协,死磕到底!