20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结

Posted pframe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结相关的知识,希望对你有一定的参考价值。

20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结

教材学习内容总结

本周学习了课本第五章的内容,主要介绍了一种新的线性集合——队列。讲解了关于队列的相关概念以及使用链表和数组实现队列的方法。

一、队列概述

  • 元素处理方式:先进先出(First In First Out,FIFO),第一个进入的元素也将是第一个退出的元素。
    • 队头(front或head):取出数据元素的一端。
    • 队尾(rear或tail):插入数据元素的一端。
  • 队列的操作
    • enqueue(也称add或insert):向队列末端添加一个元素
    • dequeue(也称remove或serve):从队列前端删除一个元素
    • first(也称front):考察队列前端的那个元素
    • isEmpty:判断队列是否为空
    • size:判断队列中的元素数目
    • toString:返回队列的字符串表示
  • 应用:存储重复编码密钥、实现售票窗口排队等
  • 队列的类型
    • 顺序队列
      技术分享图片
    • 循环队列
      技术分享图片

因为队列的后四种操作的实现都比较简单,和之前栈的相关类似操作比较类似。主要的不同体现在enqueue和dequeue上,因为栈只需在集合的一端操作,而队列需要在两端实现,所以接下来的内容主要在enqueue和dequeue两种方法上进行讨论。

二、用链表实现队列

  • 用链表进行实现时,要设置两个引用,一个指向链表首元素的引用(head),一个指向链表末尾元素的引用(tail)。
  • 对于单向链表,一般选择从末端入列,前端出列。虽然不论从前端还是后端入列,其复杂度均为O(1)。但出列时会有很大不同,从链表前端删除时复杂度仍为O(1),但在链表末端删除时,为了寻找到最末端元素的前一个,必须遍历链表,这样它的复杂度为O(n),就不如从前端删除的速度快了。
  • enqueue操作——将新元素放到链表末端
public void enqueue(T element)
    {
        LinearNode<T> node = new LinearNode<T>(element);
        if (isEmpty()) {
            head = node;
        } 
        else {
            tail.setNext(node);
        }
        tail = node;
        count++;
    }
  • dequeue操作——从链表前端删除元素
public T dequeue() throws EmptyCollectionException
    {
        if (isEmpty()) {
            throw new EmptyCollectionException("queue");
        }

        T result = head.getElement();
        head = head.getNext();
        count--;

        if (isEmpty()) {
            tail = null;
        }

        return result;
    }

三、用数组实现队列

  • 将队列的某一端固定在数组的索引0处。如果是单向列表,在删除元素时要移动元素,使得操作的效率很低,所以这种情况下可以使用环形数组来实现队列。
  • enqueue操作
public void enqueue(T element) {
        if (size() == queue.length) {
            expandCapacity();
        }
        queue[rear] = element;
        rear = (rear + 1) % queue.length;//关键代码:用于正确更新rear的值
        count++;
    }
  • dequeue操作
public T dequeue() throws EmptyCollectionException {
        if (isEmpty()) {
            throw new EmptyCollectionException("queue");
        }
        T result = queue[front];
        queue[rear] = null;
        front = (front + 1) % queue.length;
        count--;
        return result;
    }

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

  • 问题1:书上对于双端队列只是简单地讲了一下,它的具体操作有哪些?
  • 问题1解决方案:Deque的含义是“double ended queue”,即双端队列.Deque是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。Deque在Java中以接口的形式存在,同时Deque还继承Queue(队列)的接口。
  • Deque的类图:
    技术分享图片
  • 通过类图可以发现,Deque继承了Queue(队列)的接口,它的直接实现有ArrayDeque、LinkedList等。
  • Deque的基本方法
    技术分享图片
  • 由于Deque接口继承Queue接口,Deque也可以当做队列使用。
    技术分享图片
  • 除此之外,Deque也可以当做栈使用。
    技术分享图片

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

  • 问题1:在敲课本上的代码时发现很多标红,在改过之后还是不能输出正确答案。
    技术分享图片
  • 问题1解决方案:再仔细看了一下发现是代码中有的变量写错了,所有改正部分已在下图指出。
    技术分享图片

代码托管

上周考试错题总结(正确为绿色,错误为红色)

上周没有课堂测试。

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • 优点:相较上周在博客内容方面有所改进,望继续努力。
    • 问题:博客还是图文并茂好一些,这样自己或者别人都看得舒服一些_(:з」∠)_ 对于代码运行中的问题的整个过程的记录希望可以更详细一些。
  • 代码中值得学习的或问题:
    • 优点:代码相比我的更加简洁,命名更加规范。
    • 问题:commit相比上学期写的不是很好。

      点评过的同学博客和代码

  • 本周结对学习情况
    • 20172322
    • 结对学习内容
      • 主要讨论了蓝墨云的课堂实践内容,对于用链表实现插入和删除的功能进行了深入地探讨。

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

没想到书上的代码也会有错,所以说敲代码的时候也不能不用脑子地机械敲击,这样很容易产生错误。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/1 10/10
第二周 246/366 2/3 20/30
第三周 246/366 1/4 10/40
  • 计划学习时间:10小时

  • 实际学习时间:10小时

  • 改进情况:感觉本周的东西相对比较容易,和上周也有许多类似,所以学起来没有上周那么困难了。

参考资料

以上是关于20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结的主要内容,如果未能解决你的问题,请参考以下文章

20172303 2018-2019-1 《程序设计与数据结构》第5周课堂实践报告

20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结

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

20172303 2018-2019-1《程序设计与数据结构》第4周学习总结

20172303 2018-2019-1 《程序设计与数据结构》第一周学习总结

20172303 2018-2019-1 《程序设计与数据结构》第2周课堂实践修改报告