20162320刘先润大二第6周学习总结
学号20162320 《程序设计与数据结构》第6周学习总结
教材学习内容总结
- 1.队列ADT,队列(queue)是一个线性集合、它在一端添加元素,另一端删除元素,一端为对头(front),另一端称为队尾(rear),注:队列操作术语入队
enqueue
是指在队尾添加新元素,出队dequeue
是指从对头删除元素,first
是检测队头元素.
队列元素按FIFO的方式处理——最先进入的元素最先离开
- 2.使用队列:编码K值(Caesar凯撒密码是一个简单的加密算法,它将信息中的每个字符按字典序移动K位)
队列是保存重复编码k值的一种有效结构。
- 3.使用队列:模拟票务柜台(一般情况下,售票员越多,排队队伍移动越快,经理想让顾客买票的时间不超过7分钟,通过模拟营业高峰期时增加售票员带来的效果,使经理更合理地安排工作)
实现模拟时常用队列来表示等待的一列
教材实现方法:首先创建Customer类,记录了顾客到达的时间及买完票后离开的时间,离开时间减去到达时间就是顾客买票所花费总时间,然后TicketCounter模拟这个场景,外层循环判断每次循环是有多少位售票员在工作,对于每一次模拟从队列中一次得到以为顾客并有一位售票员接待,记录下花费的总时间,在每次处理的最后,计算平均时间。
- 4.使用链表实现队列
队列的链式实现方式便于找到指向链表的第一个和最后一个元素的引用。
入队和出队操作都在集合的两端进行。
入队操作(enqueue),将新元素放到表尾,表明要将当前最后一个元素的next引用指向新元素,并且rear引用重置为新的最后元素。但如果当前队列为空,front引用也必须指向新的(唯一的)元素。
出队操作(dequeue) ,如果队列中至少有一个元素。则返回链表中的首元素,然后修改front引用。当队列中只有一个元素时,当删除最前面的元素后,队列为空,则rear引用必须置为null。
first操作,返回指向队列头(front端)元素的引用。
- 5。使用数组实现队列
因为队列操作修改集合的两端,所以将一端固定在下标为0的位置就会让元素移动。
非循环数组实现队列时元素的移动得到O(n)阶复杂度。
采用数组实现队列时,把数组看成一个环,可以避免移动元素。
基于数组的队列实现策略是,将队列的一端固定在数组下标为0的地方。元素连续地保存在数组中。整数变量rear用来指示数组中的下一个空单元,它还同时代表队列的元素个数。
入队操作(enqueue),一般情况下,一个元素入队后,rear的值加1,但当入队操作填充的是数组的最后一个单元时(最大下标处),rear的值必须重置为0。
出队操作(dequeue) ,元素出队后,front的值加1。多个出队操作后,front将达到数组的最大下标处。删除最大下标处的元素后,front的值必须重置为0,而不是加1。
教材学习中的问题和解决过程
- 问题1:使用链式结构实现队列时,front引用和rear引用有可能相等吗?
解答:通过测试时,当队列为空(front和rear的值都是null)和队列中只有一个元素时会出现相等的情况。 - 问题2:课上提到如何解决队列中当front=rear而队列前还有空间时这一情况,最佳解决方案是用循环结构,为什么不能用固定表头,然后每删除一个元素就下移一位呢?
解答:通过询问多位同学,既然循环结构是最完美的解决方案在于它的时间复杂度是最低,而上述方法,包括当front=rear时另其等于0的方法都相对要高。
代码调试中的问题和解决过程
- 问题1:如何实现使用链表实现队列中出队操作?
解答:我设了两种方法,第一种就是省略的部分不能返回值。第二种便是声明一个泛型变量,考虑出队后队列是否为空两种情况,若为空,就直接令队列对头等于队尾;若不为空,则是让队头指向队头下一个的指向
public T dequeue() throws EmptyCollectionException {
//front.setNext(front.getNext().getNext());
//front.getNext().setNext(null);
T lxr = front.getElement();
while (count==1){
front=rear=null;
}
while (count!=1) {
front = front.getNext();
}
return lxr;
}
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
暂未订正
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
其他(感悟、思考等,可选)
由于第5周的作业是和第6周一起做的,所以感悟还是和第五周一样。刘老师说的话很关键,一个代码看懂了和会写是完全两个概念,而且这周的学习内容就有让我们补全书上的代码作业。虽然不是特别难,但还是考察了能力。希望同学们能够真正提高代码能力,不要再让老师们多费心去检查了。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 188 | 1/1 | 25 | 算法分析 |
第二周 | 70/258 | 1/2 | 15/40 | 《构建之法》7-9章 |
第三周 | 474/732 | 1/3 | 20/60 | 查找和排序 |
第四五六周 | 1313/2045 | 5/8 | 12/72 | 栈和队列 |
第七周 |
- 计划学习时间: 25小时
- 实际学习时间: 25小时
(有空多看看现代软件工程 课件 软件工程师能力自我评价表)