20162330 2017-2018-1《程序设计与数据结构》第六周学习总结
2017-2018-1 学习总结目录: 1 2 3 5 6 7 9 10 11 12
目录
- 0. 教材学习内容总结
- 0.1 队列ADT
- 0.2 使用队列:编码k值
- 0.3 使用队列:模拟票务柜台
- 0.4 实现队列:使用链表
- 0.5 队列的实现:使用数组
- 1. 教材学习中的问题和解决过程
- 1.1 栈与队列相比的相同点
教材学习内容总结
队列ADT
-
队列在一端添加元素,在另一端删除元素。(最先进入的元素最先离开)
【推论】队列是一个线性集合。 -
队列的元素处理方式:FIFO(先进先出)
-
在栈中,只在集合一端处理元素;在队列中,集合两端都有操作。
-
重要术语:enqueue是指在队尾添加新元素;dequeue是指从对头删除元素;first操作检测对头的元素。
-
其他方法在接口Queue的注释中已经写得很清楚了:
public interface Queue<T> {
// Adds the specified element to the rear of the queue.
public void enqueue(T element);
// Removes and returns the element at the front of the queue.
public T dequeue();
// Returns a reference to the element at the front of the queue without removing it.
public T first();
// Returns true if the the queue contains no elements and false otherwise.
public boolean isEmpty();
// Returns the number of elements in the queue.
public int size();
// Returns a string representation of the queue.
public String toString();
}
- 在非空队列中,front始终指向队头元素,rear始终指向队尾元素的下一个位置。
使用队列:编码k值
-
Caesar 密码是一个简单的加密算法,但是它的加密方法非常容易被破解,移动位数固定造成加密的局限性。
-
如果使用重复变化的k值,就可以改进Caesar 编码技术。自定义一个k值表,让每个字符移动的位数不同。这样一旦信息比k值长,就可以重新回到表头使用,既不容易被破解,又能适用于长信息的处理。
-
新的加密方法对于相同的字符加密后得到不同的字符。
使用队列:模拟票务柜台
- 常用队列表示等待的一列。
实现队列:使用链表
-
便于找到指向链表中的第一个和最后一个元素的引用。
-
入队操作:将当前最后一个元素的next引用指向新元素,并且rear引用重置为新的最后元素。
-
出队操作:必须确保至少返回一个元素。
队列的实现:使用数组
-
策略:将队列的一端固定在数组下标为0的地方。
-
非循环数组实现队列时元素的移动得到O(n)阶复杂度。
-
将数组看成一个环,可以避免移动元素。
-
入队操作:
(rear = rear + 1) % queue.length;
-
出队操作:删除最大下标处的元素之后,front值必须置为0,其余情况出队front加1。
-
循环队列:利用前端空闲空间存放新的队列元素。
教材学习中的问题和解决过程
-
【问题】:栈与队列相比相同点有哪些?
-
解决方案 :(查找相关资料)
(1)之前分析过,栈在一端操作,而队列在两端操作,但是它们都是线性结构,数据元素具有“一对一”的逻辑关系;
(2)插入操作都是限制在表尾进行;
(3)都可以通过顺序存储结构(数组)和链式存储结构实现;
(4)在时间复杂度上,插入与删除操作都需要常数时间;在空间复杂度上,情况也相同;
(5)(扩充)多栈链和多栈队列的管理模式可以相同。在计算机系统软件中,经常会出现同时管理和使用两个以上栈或队列的情况,若采用顺序存储结构实现栈和队列,将会给处理带来极大的不便,因而一般采用多个单链表来实现多个栈或队列。
代码调试中的问题和解决过程
- 暂无
代码托管
- 本周代码上传 ch15 文件夹中,统计结果是第四五六周一共的代码,其中第六周写了260行代码:
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 还未给出解析。
结对及互评
本周结对学习情况
-
莫礼钟本周比第三周的状态好一点,虽然实验只完成了第一个和第五个,设计的方法比较简单,但是都是自己做的。在学习十四章的过程中,他已经基本掌握了如何使用数组实现栈,其中一些比较重要的方法(push、pop)我已经看着他写了一遍,希望多熟练已掌握的内容,并且再恢复一些学习状态,继续增加每周学习时间。
-
- 结对学习内容
- 线性表
- 用数组实现栈(push、pop方法的实现)
- 结对学习内容
其他(感悟、思考等,可选)
本周算是比较忙的一周了,国庆之后的第一周并不轻松,除了运动会的一些杂事之外,本周的学习任务真心有点多。本周在课堂上我们又复习了查找与排序的内容,我的掌握情况还算过关,对于栈、队列这部分内容我选择“先听课再看书”的方式。到现在为止,栈的基本内容掌握了,队列的掌握情况还差很多,测试的成绩也不算高。本周我的状态有些下降,主要因为睡眠时间不足导致,下周我会将精力集中回来,并且平衡好完成团队任务和个人任务的时间。
-
【附1】教材及考试题中涉及到的英语:
Chinese English Chinese English 队尾 rear 特征 characteristic 出队 dequeue 可序列化的 serializable 入队 enqueue 外部的 external 增量 increment 制止 suppress -
【附2】本周小组博客
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 234/234 | 1/28 | 14/14 | 了解算法效率、大O符号等理论内容 |
第二周 | 255/489 | 1/29 | 12/26 | 了解敏捷的团队、泛型的使用 |
第三周 | 436/925 | 2/31 | 10/36 | 了解一些查找和排序的算法 |
第四周 | 977/1902 | 3/34 | 10/46 | 掌握实现线性结构 |
第五周 | 800/2702 | 2/36 | 12/58 | 掌握实现栈集合 |
第六周 | 260/2962 | 1/37 | 8/64 | 掌握实现队列集合 |
-
计划学习时间:12小时
-
实际学习时间:8小时
-
有效学习时间:3小时
-
改进情况:学习内容有所增加,本周我的效率极低,下周必须恢复到之前的状态,学习时务必心无旁骛。