20182334 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结

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("\r\n");
            }
            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 +"\n");
            }*/
//循环输出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将所有元素连接起来,形成一个链,一定注意链表里的元素数据要交换一定要找第三个变量,并且要用同类型的,不能混用,否则一定报错,吃过很多亏。

代码托管

上周考试错题总结

上周无考试

点评过的同学博客和代码

  • 本周结对学习情况
    • 20182321

    • 结对照片

    • 结对学习内容

      • 共同完成Android实验操作
      • 共同解决书上出现的问题。
  • 上周博客互评情况

其他(感悟、思考等)

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小时

  • 改进情况:不妥协,死磕到底!

参考资料

posted on 2019-10-31 22:57  cistineup  阅读(143)  评论(0编辑  收藏  举报