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. iptables详细设置

    1.安装iptables防火墙 怎么知道系统是否安装了iptables?执行iptables -V,如果显示如: iptables v1.3.5 说明已经安装了iptables. 如果没有安装ipta ...

  2. mysql修改表的存储引擎(myisam<=>innodb)【转】

    修改表的存储引擎myisam<=>innodb 查看表的存储引擎mysql> show create table tt7;+-------+--------------------- ...

  3. c# CTS 基础数据类型笔记

    C#中的基础数据类型并没有内置于c#语言中,而内置于.net freamework. C#有15个预定义类型,其中13个是值类型,两个是引用类型(string和object) 一.值类型 值类型 数据 ...

  4. JavaScript新手学习笔记(一)

    1.JavaScript 对大小写敏感. JavaScript 对大小写是敏感的. 当编写 JavaScript 语句时,请留意是否关闭大小写切换键. 函数 getElementById 与 getE ...

  5. Python匿名函数详解

    python 使用 lambda 来创建匿名函数. lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称的. 在Python中,lambda ...

  6. caffe+win7+vs2013 仅CPU环境安装

    笔者对深度学习一直充满着好奇与兴趣,之前学校都是研究图像处理的特征点方式,机器学习使用也不多,别提深度学习了. 在看了李宏毅大佬的PPT后,有了初步的认识,虽然是渣渣电脑,也想自己跑几个深度模型. 说 ...

  7. SqlServr性能优化性能之层次结构(十五)

    1.添加根节点: hierarchyid  GetRoot()方法 --创建数据库 create table Employeeh(EmployeeID int,Name varchar(500),Ma ...

  8. PHP性能调优---PHP-FPM配置及使用总结

    PHP-FPM配置及使用总结: php-FPM是一个PHP FastCGI的管理器,它实际上就是PHP源代码的补丁,旨在将FastCGI进程管理引进到PHP软件包中,我们必须将其patch到PHP源代 ...

  9. python 库资源大全

    偶然的机会翻到这篇文章,很全面,来源:  Python 资源大全中文版       哪些 Python 库让你相见恨晚? 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 pyth ...

  10. linux 101 hacks 6history 及相关关键字

    如果你经常使用命令行,那么有效的使用命令历史机制将会使效率获得极大提升.事实上,一旦你掌握了我在下面给出的 15 个例子, 你就会发现使用命令行将更有乐趣 是吗?我学一学呢 技巧 50:使用 HIST ...