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

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

教材学习内容总结

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

1、队列概述

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

由于队列的后四种操做的实现都比较简单,和以前栈的相关相似操做比较相似。主要的不一样体如今enqueue和dequeue上,由于栈只需在集合的一端操做,而队列须要在两端实现,因此接下来的内容主要在enqueue和dequeue两种方法上进行讨论。前端

2、用链表实现队列

  • 用链表进行实现时,要设置两个引用,一个指向链表首元素的引用(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;
    }

3、用数组实现队列

  • 将队列的某一端固定在数组的索引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解决方案:再仔细看了一下发现是代码中有的变量写错了,全部改正部分已在下图指出。

代码托管

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

上周没有课堂测试。java

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • 优势:课本单词部分很棒,从教材和代码方面的问题能看出来本周对学习内容有很深刻的思考和理解。
    • 问题:图片排版仍需改善。
  • 代码中值得学习的或问题:
    • 优势:问题解决比较详细。
    • 问题: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小时
  • 改进状况:感受本周的东西相对比较容易,和上周也有许多相似,因此学起来没有上周那么困难了。

参考资料

相关文章
相关标签/搜索