20172308《Java软件结构与数据结构》第三周学习总结
教材学习内容总结
第 5 章 队列
- 队列:
- 一种线性集合,其元素从一端加入,从另一端删除
- 元素处理:FIFO
- 与栈的比较
- 异:(1) 栈的处理过程只在栈的某一端进行;队列的处理过程在队列的两端进行。(2) 实现不一致
- 同:与栈类似,队列中也没有操作能让用户抵达队列中部,同样也没有操作允许用户重组或删除多个元素(链表可以满足这类处理)
- 队列中的方法
- 栈与队列的实现不一致:Java API提供的stack类实现了栈集合,却没有提供队列类,只提供了Queue接口,由多个类来实现
- Queue接口提供:
element方法:检索队列首部元素但不删除它
add和offer方法:往队列中添加元素
poll和remove方法:从队列中删除元素
栈的首要作用是颠倒顺序,队列的首要作用是保持顺序
- 链表实现队列
- 实现关键:队列差别栈在于必须操作链表两端。所以需要指向链表首元素的引用和指向链表末元素的引用,还有跟踪队列元素数目的变量count
- enqueue操作要求将新元素放到链表末端;
- dequeue操作实现要确保至少存在一个可返回的元素
- 数组实现队列
- 实现策略:将队列的某一端固定在数组的索引0处
- 非环形数组实现的元素位移将产生O(n)的复杂度
注:对于队列,用固定数组来实现栈的效率不高。 - 把数组看成是环形的,可以除去在队列的数组实现中把元素位移的需要
- 环形数组:并不是一种新的结构,只是数组的最后一个索引后面跟的是第一个索引,用来存储队列。
- 双端队列:队列的扩展,允许从队列的两端添加、删除和查看元素。
教材学习中的问题和解决过程
问题1:如何分析理解数组实现的队列中所需注意的问题?
问题1解析:

首先,数组实现的操作选择使得效率很低:因为用数组实现队列的策略是假定队列的首元素总是存储在数组的索引0处,而队列操作会修改集合的两端,则会要求移动元素,那么操作的复杂度为O(n);因此,用固定数组来实现队列效率不高
所以,为了除去元素移位的需要,可以引入环形数组

环形队列:内存上没有环形的结构,实际上是数组的线性空间来实现。
那么就存在一个问题:当数据达到了数组的尾部怎么办?如何判断达到了尾部?
- 数据达到尾部了可以进行数组扩容操作以达到要求。
- 判断队列为空,还是为满是环形队列的关键:当tail追上head时,队列为满时,当head追上tail时,队列为空。
【参考资料】环形队列实现原理
问题2:如何理解把数组看作是环形的,可以除去在队列的数组实现中把元素位移的需要
问题2解析:每次出队操作,头指针后移,每次入队,尾指针也后移。因为数组是固定长度连续空间,首位指针后移,队尾可插入区域会越来越小。
当然,可以每次出队,整个队列前移,但是数组移动需要牺牲性能。环形队列可以解决数组移动的缺点,当尾指针超出数组末尾时,尾指针移动数组头部。
这就将数组虚拟成了一个环形,只要队列长度没达到最大值,就可以插入,而不用移动数组。
【参考资料】
数组实现的 环形队列
代码运行中的问题及解决过程
问题1:
上周考试错题总结
错题1:

错题1解析:这道题很不细心,书上也有的代码,敲代码也很不仔细,暴露出来问题,下次一定改正
错题2:

错题2解析:“随着时间的推移,多态引用可以引用不同类型的对象”,emmm,我知道多态可以引用不同类型的对象,但是这有道翻译出来的“随着时间的推移”,我不是很懂,就给了错
错题3:

错题3解析:一个引用变量可以引用任何通过继承与它相关的类创建的对象
错题4:

错题4解析:pop操作可以通过返回对当前存储在堆栈顶部的元素的引用和调整对堆栈新顶部的顶部引用来实现
错题5:

错题5解析:公共特性不应该位于类层次结构中尽可能低的位置,从而最小化维护工作
错题6:

错题6解析:堆栈的链接实现从链表的前面添加和删除元素
代码托管

结对及互评
- 博客中值得学习的或问题:
- 侯泽洋同学的博客排版工整,界面很美观
- 问题总结做得很全面
- 对于书上的疑惑总会想办法解决它,这种探索的精神值得我去学习
- 代码中值得学习的或问题:
- 对于编程的编写总能找到角度去解决
- 本周结对学习情况
- 20172302
- 结对学习内容
- 第三章内容:集合概述——栈
- 第四章内容:链式结构——栈
补充作业
我认为对我最重要的五项技能以及现在所处的水平:
- 保持高标准,不要受制于破窗理论(broken windows theory)
当你看到不靠谱的设计、糟糕的代码、过时的文档和测试用例的时候,不要想 “既然别人的代码已经这样了,我的代码也可以随便一点啦。”
现在的水平:如果有明确要求,我可以做好
想在课程结束后达到的水平:不但主动做, 还会影响同事一起做好
- 经常给自己充电,身体训练是运动员生活的一部分,学习是软件工程师职业的伴侣。每半年就要了解和学习一些新的相关技术。通过定期分享(面对面的分享,写技术博客等)来确保自己真正掌握了新技术。
现在的水平:看了就忘
想在课程结束后达到的水平:不但主动做, 还会影响同事一起做好
- 通过快速原型来学习,快速原型的目的是学习,它的价值不在于代码,而在于你通过快速原型学到了什么。
现在的水平:从来没听说过
想在课程结束后达到的水平: 不但主动做, 还会影响同事一起做好
- 估计任务所花费的时间,避免意外。在开始工作的时候,要做出时间和潜在影响的估计,并通告相关人士,避免最后关头意外发生。工作中要告知可能的时间变化,事后要总结
现在的水平:做完了,就知道花费了,不用事先估计
想在课程结束后达到的水平:不但主动做, 还会影响同事一起做好
- 图形界面的工具有它的长处,但是不要忘了命令行工具也可以发挥很高的效率,特别是可以用脚本构建各种组合命令的时候。
现在的水平:一直用鼠标和GUI
想在课程结束后达到的水平: 不但主动做, 还会影响同事一起做好
学习进度条
| 代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
|---|---|---|---|---|
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 0/0 | 1/1 | 4/4 | |
| 第二周 | 560/560 | 1/2 | 6/10 | |
| 第三周 | 415/975 | 1/3 | 6/16 |
20172308《Java软件结构与数据结构》第三周学习总结的更多相关文章
- 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结
20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...
- 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结
20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 <Java软件结构与数据结构>第十五章-图 一.图及无向图 1.图的相关概 ...
- 2018-2019-20172321 《Java软件结构与数据结构》第九周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 第15章 图 无向图 图由顶点和边组成. 顶点由名字或标号来表示,如:A.B.C.D: ...
- 《JAVA软件结构与数据结构》第一周学习总结
学号 20172326 <JAVA软件结构与数据结构>第一周学习总结 教材学习内容总结 软件质量的几大特性 增长函数与大O记法 大O记法用来表示表示增长函数,从而来表示算法的复杂度 算法的 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第二周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 <Java软件结构与数据结构>第三章 集合概述--栈 一.集合 1.我们印 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第二周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第二周学习总结 教材学习内容总结 本周内容主要为书第三章和第四章的内容: 第三章(以数组来替代栈的作用) 集合(聚集 ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...
- 20172329 2018-2019《Java软件结构与数据结构》第一周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第一周学习总结 在这学期就已经大二了,也已经步入了学习专业课的核心时间,在这个阶段,我们应该了解自己的学习情况,针对自己 ...
- 20172328 2018-2019《Java软件结构与数据结构》第一周学习总结
20172328 2018-2019<Java软件结构与数据结构>第一周学习总结 概述 Generalization 本周学习了软件质量.数据结构以及算法分析的具体内容,主要依托于所用教材 ...
随机推荐
- meeting,symposium,seminar 等区别
meeting,symposium,seminar 等区别 会议分类的方式可说是不胜枚举,这点初步由英文对会议名称的写法,就可看出端倪,像是Assembly,Caucus,Colloquium, Co ...
- 【NOI】2017 蚯蚓排队(BZOJ 4943,LOJ 2303) 模拟+hash
[题目]#2303. 「NOI2017」蚯蚓排队 [题意]给定n条长度不超过6的蚯蚓,初始各自在一个队伍.m次操作:1.将i号蚯蚓和j号蚯蚓的队伍合并(保证i为队尾,j为队首).2.将i号蚯蚓和它后面 ...
- HDU 1875 畅通工程再续 最小生成树问题
题目描述:输入一个T,表示有T组测试数据,然后每组测试数据有一个C,表示在一个湖里面有C座岛屿,现在要在岛屿之间修建桥,可以修建必须满足的条件是岛与岛之间的距离在10到1000的范围内,然后给出每座岛 ...
- 第7月第20天 epoll
1. ) { struct sockaddr in_addr; socklen_t in_len; int infd; char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; ...
- Ettercap之ARP+DNS欺骗
1.网络攻击拓扑环境 网关:192.168.133.2 攻击者:192.168.133.128 受害者:192.168.133.137 2.原理讲解 ARP欺骗 简介:ARP(Address Reso ...
- 一个无锁消息队列引发的血案(三)——地:q3.h 与 RingBuffer
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 初始ASP.NET数据控件【续 ListView】
ListView控件 ListView控件可以用来显示数据,它还提供编辑,删除,插入,分页与排序等功能.ListView是GridView与DataList的融合体,它具有GridView控件编辑 ...
- CentOS版本区别及 Linux目录结构及其详解
CentOS 7.0体验与之前版本的不同http://www.linuxidc.com/Linux/2014-07/104196.htm CentOS版本选择http://www.centoscn.c ...
- 在局域网内实现https安全访问
在局域网内实现https安全访问 准备原料 服务器 resin (当然也可以是tomcat,这里以resin为例) 安装jdk 域名 (随便写一个就行,因为是内网使用,不会被校验) 生成证书 第一步: ...
- redux,react-redux、redux-thunk、redux-logger、redux-promise实例
使用的是create-react-app脚手架 package.json增加反向代理 "proxy": { "/v4": { "target" ...