学号 20172326 《程序设计与数据结构》第三周学习总结
教材学习内容总结
- 队列是先进先出的数据结构(FIFO)与栈不同,队列的两端可分别进行操作
- first与front相同,返回首段的值
- API中的队列方法,有add,element,offer,peek,poll,remove
- 用链表实现队列时,enqueue和dequeue的算法复杂度均为O(1)
- 用数组实现队列时,enqueue和dequeue的算法复杂度均为O(n),因为无论将索引值定为头或者尾,插入或删除时,总会使得所有元素位置发生改变。
- 非环形数组实现的元素位移,将产生O(n)的复杂度。
- 由数组实现的队列中,rear和栈中的top类似,表示队列中的元素个数,以及数组中下一个空闲单元。
- 为了提高算法的效率, 我们使用环形数组实现队列,同时,为了使rear在循环时始终拥有正确的值,使用
rear = (rear + 1) % queue.length;
来确保。
教材学习中的问题和解决过程
- 问题1:
(图)add方法与offer方法的区别,以及优先级的体现在哪里?
- 问题1理解:
(图)可以看出,在api中,offer方法更为全面,对限制大小的队列进行了考虑,使得其不抛出异常,而是抛出false。
-
问题2:数组队列与链表队列中谁的空间复杂度更差的问题
-
问题2理解:对于一个数组队列,其空间总是预先分配好的,因此,如果元素个数小于分配的空间,那么势必造成空间的浪费。但同时,链表中没一个节点都存储着对下一个节点的引用,因此,随着存储的元素逐渐增多,占用的空间也将更多,所以,链表队列也存在着空间的浪费问题
-
问题3:对于deque(双向队列)的理解
-
理解:对于这个问题,我本来认为,在两端的删除,插入方法,将破坏队列所具有的顺序性。但是我们不妨仔细看一下他们的方法,
(图)可以看到,拥有这些方法后,deque便不再是一个简单的队列,简单的具有FIFO的数据结构。它也可以被当做栈使用,当然,效率会减低。除此之外,还有多线程的部分情况也可以用到deque。
代码调试中的问题和解决过程
- 问题:
(图)
编写课后习题时,出现了空指针的异常
- 问题解决方案:问题在于我没有将参数的含义搞清,count表示当前个数,而对于scan这个索引值来说,自然需要减一,否则,出现了指针实际已经遍历,但由于比count少一仍要继续向下,但笑一个为空的情况
代码托管
点评过的同学博客和代码
结对学习内容
- 第5章 队列
结对及互评
- 博客中值得学习的或问题:
排版精美,对于问题研究得很细致,解答也很周全。 - 代码中值得学习的或问题:
代码写的很规范,思路很清晰,继续加油!
上周考试错题总结
- 无
其他(感悟、思考等,可选)
- 本周依旧在数组与链表的基础上进行队列的学习,对链表的理解有了进一步的认识,同时,将栈与队列的不同也有了了解。但是,关于链表,我依旧存在一定不足,需要继续练习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 3/3 | |
第二周 | 409/409 | 1/2 | 5/8 | |
第三周 | 1174/1583 | 1/3 | 10/18 |