2018-2019-20172329 《Java软件结构与数据结构》第三周学习总结

教材学习内容总结

《Java软件结构与数据结构》第五章-队列

一、概述

  • 1、队列是什么?

队列是种线性集合,其元素从一端加入,从另一端删除;注:队列是按照先进先出的方式处理的。从队列中删除元素的次序,与放置元素的次序是一样的。

  • 2、队列的构成

(1)方法:

操作 描述
enqueue 向队列末端添加一个元素
dequeue 从队列前段删除一个元素
first 考察队列前端的那个元素
isempty 判定队列是否为空
size 确定队列的元素数目

(2)过程

  • 3、其他内容

(1)队列是一种可存储重复编码密钥的便利集合。

(2)通常用表示排队的队列来实现模拟。

二、用链表实现队列

  • 1、概述

(1)那两个分别指向链表首元素、链表末元素的引用方便队列的链表实现。

(2)为了从链表的末端出列,必须把一个临时变量设置为指向链表末端的元素。

  • 2、链表实现的过程图
  • 3、enqueue操作

(1)enqueue操作要求将新元素放到链表末端。

(2)注:新结点的next引用无需显示的进行设置。

  • 4、dequeue操作

(1)enqueue和dequeue操作作用于队列的对立端。

三、用数组实现队列

  • 1、概述

(1)由于队列操作会修改集合的两端,因此将一端固定于索引0处要求移动元素。

(2)非环形数组实现的元素移位,将产生O(n)的复杂度。

(3)把数组看成环形的,可以出去在队列的数组实现中把元素移位的需要。

  • 2、环形数组

(1)概述:简单来讲就是如果数组的最后一个索引后面跟的是第一个索引,就可用作环形数组。

(2)注:当添加和删除元素时,不需要移动哪个元素,但是一定要小心维护front和rear的值。

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

  • 问题1:在用链表实现队列的时候,我们所需要的有两个front结点和rear的结点,但是他们是否实际存在,或者另一种表达就是是否可以给其赋值?
  • 问题1解决过程:

(1)首先,对于只有一端的队列而言,符合的应当是先进先出的原则,所以最先进入的就应当是最先出去的元素,在进入多个元素以后,这一个先进入的元素就会变成一个队列的队尾,所以在书中有这样一句话:

“为了从链表的末端出列,必须把一个临时变量设置为指向链表末端的元素,然后把tail指针设置为指向当前末端之前的结点。”

所以对于队尾来讲,有这样一个rear的结点进行“管理”,防止元素丢失。
(2)而对于首来讲,更是重要,它需要去确定每一个元素的位置,防止整个队列元素的丢失。所以下图的展示很能够体现队列的这样一种不同于链表的结构。

简单表达就是头结点其实相当于队列第一个元素所在结点的前一个结点,通过其来确定整个队列内部元素的位置

  • 问题2:对于循环数组整个流程到底是如何进行的?
  • 问题2解决方案:(该解决方法为搬运,来源已在参考资料中显示,参考原文请到参考文献查看)
  • 在学习了循环数组以及循环队列以后,我发现其原理很相似,所以进行图示,方便理解;

(1)在我们数组的实现方式中,用两个int型变量用于记录队头和队尾的索引。

图一:

(2)一个队列的初始状态,head和tail都指向初始位置(索引为0处)。head永远指向该队列的队头元素,tail则指向该队列最后一个元素的下一位置,当有入队操作时:

图2:

图3:

(3)当有出队操作时:

图4:

(4)当遇到出队操作时,head会移向下一元素位置。当然,对于这种方式入队和出队,队空的判断条件显然是head=tail,队满的判断条件是tail=array.length(数组最后一个位置的下一位置)。显然,这种结构最致命的缺陷就是,tail只知道向后移动,一旦到达数组边界就认为队满,但是队列可能时刻在出队,也就是前面元素都出队了,tail也不知道。例如:

图5:

(5)此时tail判断队满,我们暂时认为资源利用是可以接受的,但是如果接下来不断发生出队操作:

图6:

(6)此时tail依然通过判断,认为队满,不能入队,这时数组的利用率我们是不能接受的,这样浪费很大。所以,我们引入循环队列,tail可以通过mode数组的长度实现回归初始位置,下面我们具体来看一下。

按照我们的想法,一旦tail到达数组边界,那么可以通过与数组长度取模返回初始位置,这种情况下判断队满的条件为tail=head

图7:

(7)此时tail的值为8,取模数组长度8得到0,发现head=tail,此时认为队列满员。这是合理的,但是我们忽略了一个重要的点,判断队空的条件也是head=tail,那么该怎么区分是队空还是队满呢?解决办法是,空出队列中一个位置,如果(tail+1)%array.length=head,我们就认为队满,下面说明其合理性。

上面遇到的问题是,tail指向了队尾的后一个位置,也就是新元素将要被插入的位置,如果该位置和head相等了,那么必然说明当前状态已经不能容纳一个元素入队(间接的说明队满)。因为这种情况是和队空的判断条件是一样的,所以我们选择舍弃一个节点位置,tail指向下一个元素的位置,我们使用tail+1判断下一个元素插入之后,是否还能再加入一个元素,如果不能了说明队列满,不能容纳当前元素入队(其实还剩下一个空位置),看图:

图8:

(8)tail通过取模,回归到初始位置,我们判断tail+1是否等于head,如果等于说明队满,不允许入队操作,当然这是牺牲了一个节点位置来实现和判断队空的条件进行区分。上述文字基本完成了队循环队列的理论介绍,下面我们看在Java中对该数据结构的具体实现是怎样的。

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

  • 问题1:最近在编写代码的过程中,感觉遇到的最多的就是空指针这个异常,如下图,我在这里分享一些我一般而言解决这一系列问题的一些技巧。

  • 问题1解决方案:

(1)首先,在下面的地方可以看见出错的地方在哪里,因为为什么会出现空指针呢,就是因为我们想要索引的地方就是一个null,所以肯定就会出现异常,因此呢,就一般而言我就再找一个新指针,作为一个测试指针,找到出错在哪一步。(这里肯定会有人说为什么不用bug,因为我觉得这个找错也是一种方法,但是就我个人而言,我觉得bug一点一点的又点慢,所以就找了新方法)

(2)然后我一般而言会在循环里找问题,因为有时候就是因为多移了一步可能就导致了这一个问题,所以我们可以给他减或加一次循环进行查看,结果是否可以成功输出。

上周考试错题总结

由于上周没有进行测试,所以没有错题总结

代码链接

结对及互评

  • 本周结对学习情况

  • 博客中值得学习的或问题:
    • 内容详略得当;
    • 代码调试环节比较详细;
  • 基于评分标准,我给本博客打分:5分。得分情况如下:
  1. 正确使用Markdown语法(加1分):
  2. 模板中的要素齐全(加1分)
  3. 教材学习中的问题和解决过程, 一个问题加1分
  4. 代码调试中的问题和解决过程, 一个问题加1分

  • 博客中值得学习的或问题:

    • 内容详略得当;
    • 代码调试环节比较详细;
  • 基于评分标准,我给本博客打分:9分。得分情况如下:
  1. 正确使用Markdown语法(加1分):
  2. 模板中的要素齐全(加1分)
  3. 教材学习中的问题和解决过程, 一个问题加1分
  4. 代码调试中的问题和解决过程, 一个问题加1分

感悟

我觉得这个中秋节过的非常充实,希望自己自己尽快再找到更好的状态去面对新的学期,让自己可以学到更多知识,可以让自己在这学期可以有更多的收获。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 0/0 1/1 6/6
第二周 1313/1313 1/2 20/26
第三周 901/2214 1/3 20/46

补充作业

技能 课前评估 课后评估
对编程整体的理解 2 6
架构设计、模块化设计、接口设计 2 6
效能分析及改进 2 6
处理大数据 1 6
处理命令行参数和文件系统 1 6
自主学习的能力 5 7

参考资料

蓝墨云班课
Java程序设计
深入理解循环队列----循环数组实现ArrayDeque

2018-2019-20172329 《Java软件结构与数据结构》第三周学习总结的更多相关文章

  1. 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...

  2. 20172329 2018-2019《Java软件结构与数据结构》第一周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第一周学习总结 在这学期就已经大二了,也已经步入了学习专业课的核心时间,在这个阶段,我们应该了解自己的学习情况,针对自己 ...

  3. 20172328 2018-2019《Java软件结构与数据结构》第一周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第一周学习总结 概述 Generalization 本周学习了软件质量.数据结构以及算法分析的具体内容,主要依托于所用教材 ...

  4. 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...

  5. 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.图及无向图 1.图的相关概 ...

  6. 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...

  7. 《JAVA软件结构与数据结构》第一周学习总结

    学号 20172326 <JAVA软件结构与数据结构>第一周学习总结 教材学习内容总结 软件质量的几大特性 增长函数与大O记法 大O记法用来表示表示增长函数,从而来表示算法的复杂度 算法的 ...

  8. 2018-2019-20172329 《Java软件结构与数据结构》第二周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 <Java软件结构与数据结构>第三章 集合概述--栈 一.集合 1.我们印 ...

  9. 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...

  10. 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...

随机推荐

  1. Esper复杂事务处理一小时入门

    来自小韩 什么是Esper 想要认识Esper,先要了解CEP(Complex Event Processing),到处都有,并且各方理解也有偏差,我就不赘述了. Esper就是CEP的一个java的 ...

  2. PE结构详解

    1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是“虚拟地址”而不是“物理地址”.为什么不是“物理地址”呢?因为数据在内存的位置经常在变,这样可以节省内存开支.避开错误的内存位置等 ...

  3. Linux MySQl 5.7.17 MySQL ERROR 1366(HY000):Incorrect string value 解决方法

    MySQL ERROR 1366(HY000):Incorrect string value,在往数据库中插入中文的时候会出现. 这也就是编码问题,网上大部分都是说设置下配置文件中的设置,而可悲的是在 ...

  4. shell脚本编程之“最简单的死循环”【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3475462.html 在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那 ...

  5. select()函数用法二

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...

  6. Mysql_Learning_Notes_mysql系统结构_2

    Mysql_Learning_Notes_mysql系统结构_2 三层体系结构,启动方式,日志类型及解析方法,mysql 升级 连接层 通信协议处理\线程处理\账号认证(用户名和密码认证)\安全检查等 ...

  7. 九、springcloud之服务网关zuul(二)

    一.路由熔断 当我们的后端服务出现异常的时候,我们不希望将异常抛出给最外层,期望服务可以自动进行一降级.Zuul给我们提供了这样的支持.当某个服务出现异常时,直接返回我们预设的信息. 我们通过自定义的 ...

  8. XP远程连接Win10,提示【远程计算机需要网络级别身份验证,而您的计算机不支持该验证】

    最近电脑安装了Win10系统,在办公室可以通过其他电脑远程,但是回去后使用自己的电脑(XP系统)进行远程提示失败, 提示[远程计算机需要网络级别身份验证,而您的计算机不支持该验证],然后上网查找资料, ...

  9. JsRender 前端渲染模板常用API学习

    JsRender 常用API 1. $.templates() $.templates()方法是用来注册或编译模板的,使用的情况有以下几种. 把html字符串编译编译成模板 获取使用script标签声 ...

  10. java基础63 JavaScript中的Number、Math、String、Date对象(网页知识)

    本文知识点(目录): 1.Number对象    2.Math对象    3.String对象    4.Date对象 (日历例子) 1.Number对象 1.1.Number对象的创建方式 方式1: ...