20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结
Posted pframe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结相关的知识,希望对你有一定的参考价值。
20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结
教材学习内容总结
本周学习了课本第五章的内容,主要介绍了一种新的线性集合——队列。讲解了关于队列的相关概念以及使用链表和数组实现队列的方法。
一、队列概述
- 元素处理方式:先进先出(First In First Out,FIFO),第一个进入的元素也将是第一个退出的元素。
- 队头(front或head):取出数据元素的一端。
- 队尾(rear或tail):插入数据元素的一端。
- 队列的操作
- enqueue(也称add或insert):向队列末端添加一个元素
- dequeue(也称remove或serve):从队列前端删除一个元素
- first(也称front):考察队列前端的那个元素
- isEmpty:判断队列是否为空
- size:判断队列中的元素数目
- toString:返回队列的字符串表示
- 应用:存储重复编码密钥、实现售票窗口排队等
- 队列的类型
- 顺序队列
- 循环队列
- 顺序队列
因为队列的后四种操作的实现都比较简单,和之前栈的相关类似操作比较类似。主要的不同体现在enqueue和dequeue上,因为栈只需在集合的一端操作,而队列需要在两端实现,所以接下来的内容主要在enqueue和dequeue两种方法上进行讨论。
二、用链表实现队列
- 用链表进行实现时,要设置两个引用,一个指向链表首元素的引用(head),一个指向链表末尾元素的引用(tail)。
- 对于单向链表,一般选择从末端入列,前端出列。虽然不论从前端还是后端入列,其复杂度均为O(1)。但出列时会有很大不同,从链表前端删除时复杂度仍为O(1),但在链表末端删除时,为了寻找到最末端元素的前一个,必须遍历链表,这样它的复杂度为O(n),就不如从前端删除的速度快了。
- enqueue操作——将新元素放到链表末端
public void enqueue(T element)
{
LinearNode<T> node = new LinearNode<T>(element);
if (isEmpty()) {
head = node;
}
else {
tail.setNext(node);
}
tail = node;
count++;
}
- dequeue操作——从链表前端删除元素
public T dequeue() throws EmptyCollectionException
{
if (isEmpty()) {
throw new EmptyCollectionException("queue");
}
T result = head.getElement();
head = head.getNext();
count--;
if (isEmpty()) {
tail = null;
}
return result;
}
三、用数组实现队列
- 将队列的某一端固定在数组的索引0处。如果是单向列表,在删除元素时要移动元素,使得操作的效率很低,所以这种情况下可以使用环形数组来实现队列。
- enqueue操作
public void enqueue(T element) {
if (size() == queue.length) {
expandCapacity();
}
queue[rear] = element;
rear = (rear + 1) % queue.length;//关键代码:用于正确更新rear的值
count++;
}
- dequeue操作
public T dequeue() throws EmptyCollectionException {
if (isEmpty()) {
throw new EmptyCollectionException("queue");
}
T result = queue[front];
queue[rear] = null;
front = (front + 1) % queue.length;
count--;
return result;
}
教材学习中的问题和解决过程
- 问题1:书上对于双端队列只是简单地讲了一下,它的具体操作有哪些?
- 问题1解决方案:Deque的含义是“double ended queue”,即双端队列.Deque是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。Deque在Java中以接口的形式存在,同时Deque还继承Queue(队列)的接口。
- Deque的类图:
- 通过类图可以发现,Deque继承了Queue(队列)的接口,它的直接实现有ArrayDeque、LinkedList等。
- Deque的基本方法
- 由于Deque接口继承Queue接口,Deque也可以当做队列使用。
- 除此之外,Deque也可以当做栈使用。
代码调试中的问题和解决过程
- 问题1:在敲课本上的代码时发现很多标红,在改过之后还是不能输出正确答案。
- 问题1解决方案:再仔细看了一下发现是代码中有的变量写错了,所有改正部分已在下图指出。
代码托管
上周考试错题总结(正确为绿色,错误为红色)
上周没有课堂测试。
结对及互评
点评模板:
- 博客中值得学习的或问题:
- 优点:相较上周在博客内容方面有所改进,望继续努力。
- 问题:博客还是图文并茂好一些,这样自己或者别人都看得舒服一些_(:з」∠)_ 对于代码运行中的问题的整个过程的记录希望可以更详细一些。
- 代码中值得学习的或问题:
- 优点:代码相比我的更加简洁,命名更加规范。
问题:commit相比上学期写的不是很好。
点评过的同学博客和代码
- 本周结对学习情况
- 20172322
- 结对学习内容
- 主要讨论了蓝墨云的课堂实践内容,对于用链表实现插入和删除的功能进行了深入地探讨。
其他(感悟、思考等,可选)
没想到书上的代码也会有错,所以说敲代码的时候也不能不用脑子地机械敲击,这样很容易产生错误。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 10/10 | 1/1 | 10/10 | |
第二周 | 246/366 | 2/3 | 20/30 | |
第三周 | 246/366 | 1/4 | 10/40 |
计划学习时间:10小时
实际学习时间:10小时
改进情况:感觉本周的东西相对比较容易,和上周也有许多类似,所以学起来没有上周那么困难了。
参考资料
以上是关于20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结的主要内容,如果未能解决你的问题,请参考以下文章
20172303 2018-2019-1 《程序设计与数据结构》第5周课堂实践报告
20172303 2018-2019-1 《程序设计与数据结构》第3周学习总结
20172303 2018-2019-1 《程序设计与数据结构》第2周学习总结
20172303 2018-2019-1《程序设计与数据结构》第4周学习总结