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
    • 结对学习内容
      • 主要讨论了Deque的实现和PP5.7的做法

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

  • 没想到书上的代码也会有错,所以说敲代码的时候也不能不用脑子地机械敲击,这样很容易产生错误。
  • 补充作业
    • 在你一生中身体最健康、最旺盛的时候,能在大学学习和研究,是一生中少有的机会。请说明一下,你以及具备的专业知识、技能、能力上还差距哪些?请看这个技能调查表,从表中抽取5-7项你认为对你特别重要的技能,记下你目前的水平,和你想在课程结束后达到的水平(必须列出5项)。链接:http://www.cnblogs.com/xinz/p/3852177.html
    • 我所认为的对我特别重要的技能:
    • Programming:Comprehension(程序理解)(如何理解已有的程序,通过阅读,分析,DeBug)
      • 课前评估:4 —— 课后评估:9
    • Programming:Design(架构设计,模块化设计,接口设计)
      • 课前评估:3 —— 课后评估:8
    • Programming:Code Review/Code Quality(代码复审/代码规范/代码质量)
      • 课前评估:3 —— 课后评估:9
    • Programming:Command Line and files(处理命令行参数和文件系统)
      • 课前评估:Command Line 3 files 2 —— 课后评估:9
    • Programming:Big Data(处理大数据)
      • 课前评估:1 —— 课后评估:7
    • Development on Different PlateForms
      • 课前评估:3 —— 课后评估:71
    • 其实其中有很多内容(比如后面几条)我都是处于0的是完全不了解的,但正是因为不了解,所以我不敢轻易下定义它对我是否重要和我应该学到哪种程度。只能说明我前面还有很长的路要走,Fighting!!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 10/10 1/1 10/10
第二周 246/366 2/3 20/30
第三周 567/903 1/4 10/40
  • 计划学习时间:10小时
  • 实际学习时间:10小时
  • 改进情况:感觉本周的东西相对比较容易,和上周也有许多类似,所以学起来没有上周那么困难了。

参考资料

posted @ 2018-09-26 23:02  框框框  阅读(292)  评论(3编辑  收藏  举报