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

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

教材学习内容总结

第十二章 算法分析

  • 1.算法效率(决定着一个程序执行的速度)
  • 2.增长函数与大O符号。增长函数表明问题大小(n)与希望优化的值之间的关系。该函数表示时间复杂度或空间复杂度。渐进复杂度称为算法的阶。记为O(n)

第十四章 栈

  • 1.集合分为两大类:①线性集合:按照顺序一个一个排。②非线性集合:存在顺序并列的情况。
  • 2.栈是一种线性集合,元素按后进先出(LIFO)的方法进行处理,有push,pop,peek,isempty,size等常用操作
  • 3.栈是用于计算后缀表达式的理想数据结构,在进行运算时,先把中缀表达式转为后缀表达式,然后从左到右扫描,数字入栈,遇见符号,把前两个数字进行相应的运算然后放入栈中(减法是第二个数减去栈顶的数)。
  • 4.链式结构是基于数组的集合实现的主要代替方案,链表是一种链式结构,自引用式构成了链表的基础,在链表中存储的对象通常泛称为结点node
  • 5.链表会按需动态增长,因此本质上,它没有容量限制
  • 6.使用链表实现的栈和使用数组实现的栈一样,都需要写出相应的push、pop等方法。

第十五章 队列

  • 1.队列是一种线性集合,元素从一段加入从另一端删除(先进先出)。
  • 2.队尾(tail),队首(head),队列前端(front),队列末端(rear)。
  • 3.通过链表和数组实现队列。
  • 4.队列需具备的基本方法

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

  • 问题1:哑结点是什么,有什么作用?
  • 问题1解决方案:哑结点其实就是放在第一个存放数据结点之前、头结点之后的结点。加入哑结点之后就会方便执行链表的一些操作。
  • 问题2:LinkedStack类与ArrayStack类的对比。
  • 问题2解决方案:stack的实现分为两种,一种是使用数组来模拟栈,另外一种是使用链表来模拟栈,ArrayStack使用数组来实现,LinkedStack使用链表来实现。
  • 问题3:Queue接口两种方法add和offer在异常类处理上有何不同。
  • 问题3解决方案:区别:两者都是往队列尾部插入元素,不同的时候,当超出队列界限的时候,add()方法是抛出异常让你处理,而offer()方法是直接返回false
  • 问题4:为什么用数组实现队列时,环形数组较好?
  • 问题4解决方案:环形队列可以解决数组移动的缺点,当尾指针超出数组末尾时,尾指针移动数组头部。这就将数组虚拟成了一个环形,只要队列长度没达到最大值,就可以插入,而不用移动数组。
  • 问题5:链表和数组的异同点
  • 问题5解决方案:数组能根据下标随机读取,链表要访问一个结点需要一个个摸过去;链表比数组节省空间,而且在面对多次循环,元素数量不确定时,链表能比数组更方便地开空间。

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

  • 问题1:ArrayStack类核心方法的实现(用数组实现栈)
  • 问题1解决方案:
    压栈方法push

    public void push (T element){
       if(count == stack.length)
           expandCapacity();
       stack[count] = element;
       count ++;
    }
    private void expandCapacity(){
       T[]larger = (T[])(new Object[stack.length*2]);
       for(int index=0;index<stack.length;index++)
           larger[index] = stack[index];     
       stack = larger;
    }

    出栈方法pop()

    public T pop() throws Exception
      {
          if (count==0)
              throw new Exception("PopExpection");
          else
          count--;
          T math = stack[count];
          stack[count] = null;
          return math;
      }

    peek()方法

    public T peek() throws Exception
      {
          if (count==0)
              throw new Exception("PeekExpection");
          else
          return stack[count-1];
      }
  • 问题2:用泛型定义的数组在实例化时出现问题。

    public ArrayStack() {
      top = 0;
      stack = (new T[capacity]);
    }
  • 问题2解决方案:在整个实例化之前加T[]就可以使数组实例化。

    public ArrayStack() {
      top = 0;
      stack = ( T[]) (new Object[capacity]);
    }

代码托管

上周考试错题总结

上周没有考试,所以没有错题。

点评过的同学博客和代码

  • 本周结对学习情况
    • 20182317
    • 20182318
    • 结对学习内容
      • 对一些程序渐进复杂度的计算
      • 对栈的一些讨论和学习。包括出栈,入栈,删除等等
      • 对队列的一些讨论和学习。包括链表和数组实现队列,入队、出队等等
  • 上周博客互评情况

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

  • 这周学习了三章的内容,学会了很多的东西,包括程序复杂度的计算,栈和队列的实现以及在Android上实现一些栈和队列的操作。
  • 感觉后期的任务量有点太重了,毕竟越到后面代码难度也越来越大了,但是任务量却是也上来了,有点扛不住了。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 10000行 30篇 400小时
第一周 56/56 2/2 20/20 主要学会了简单的操作Linux以及如何编写简单的java程序并将它上传到码云
第二、三周 331/407 3/5 23/43 学会了一些类和程序包的使用,也明白了C语言和Java在有些地方的区别
第四周 595/1002 2/7 20/60 学会了IDEA以及用IDEAgit码云,也学会了TDD测试
第五周 1621/2623 2/9 17/77 见识了服务器与用户链接的代码,也学习了继承的一些知识。
第六周 1770/4393 1/10 22/99 学习了多态以及与接口和继承的关系,还有就是对异常的学习和处理异常的方法以及自定义一个异常
第七周 1747/6140 3/13 23/122 学习了渐进复杂度的计算,栈和队列的学习,分别用数组和链表实现队列
  • 计划学习时间:20小时
  • 实际学习时间:23小时
  • 改进情况:代码已过6000,初步完成了不挂科的指标。

参考资料

猜你喜欢

转载自www.cnblogs.com/qianjiayu/p/11786112.html