Proj1a 数据结构:双端队列| CS61B-Spring-2018
主要任务
编写双端队列,能够addFirst, remove First, addLast, removeLast.并实现其他一些辅助功能。
使用两种数据结构来完成双端队列,分别是链表和数组。
要求这两种数据结构的add和remove操作都花费O(1)的时间,即与队列长度无关。
LinkedListDeque
主要思路见Week2中的双向链表。主要思路是:
- 循环链表与哨兵节点:在双向链表中设置一个哨兵节点,它的next永远指向第一个节点,pre永远指向最后一个节点(即使此时链表为空,只有它自己,那么next和pre就都指向自己)。
较为顺利,因为实现的结构与双向链表非常相似。
但递归实现get时,稍微遇到了一点问题,最后添加了一个辅助方法:
public T getRecursive(int index) {if (index > size - 1) {return null;}return getR(sentinel.next, index);}private T getR(ItemNode l, int i) {if (i == 0) {return l.item;}return getR(l.next, i - 1);}
getRecursive这个方法肯定不是递归的,因为传参不传ItemNode,根本没法找到剩下的,所以要添加一个传了ItemNode的方法。
ArrayDeque
这个真是想到头秃…………核心思路有两个点:
循环数组:一开始,令数组中任意两个相邻的节点为nextfirst和nextlast,将数组以这两个中心向两端扩展,遇到头就回到尾部,遇到尾就回到头部。
详细图示说明(科学上网)处理循环数组中的索引:将双端队列中数的下一个数的位置映射到实际的数组中。例如,这一个数索引为items.length-1(即数组最后),则下一个数应该位于0位置.若索引还不到最后一位,则下一个数的位置就是下一个数的索引,正常+1即可。
这个trick应该很常用于循环。每次将索引+1,一到某个阈值 就从头开始。
也不一定是+1,可以+任意值,总之处理循环数据结构的索引也许可以这么用。
private int addOne(int a) {return (a + 1) % items.length;}private int subOne(int a) {return (a - 1 + items.length) % items.length;}类似地,在get时,也可以使用这个思想:int start = addOne(nextfirst);return items[(start + index) % items.length];
编写中的问题
“Raw use of parameterized class”
原理:
java Generic Type/Parameterized Type/Raw Type
What Is a Generic Type? A generic type is a generic class or interface that uses type parameters.(即SLList< T >这个类。)
What Is a Parameterized Type? A parameterized type is a parameterized version of a generic class or interface. For example, Vector< String > is a parameterized type.(SLList< T >这种类型就是一个Parameterized Type。)
What Is a Raw Type? A raw type is a parameterized type with the parameter type argument omitted. For example, Vector is raw type.(SLList不带< T >就是一个raw type)
Java其实是支持只用raw type的,但是会警告。修改方法:将嵌套类的声明改为
public class ItemNode
,去掉< T >和static。(去掉static的原因是,让嵌套类内部的T访问到外部< T >,知道这是个泛型。)
而去掉的原因是,之前ItemNode类被声明为ItemNode< T >,后面用它的时候却只用了ItemNode,所以会警告。
除法
想要表达size/items.length<0.25
,即使是(double)size/items.length<0.25
也不行,只能:size < (items.length / 4)
提交的一些错误
- 格式:运算符前后空格、if要用{}、{前面要有空格
- 嵌套类、实例变量private
- 注意队列为空还要delete的情况
最终
github地址
还是有些地方没有加空格这种格式错误,懒得改了…
Proj1a 数据结构:双端队列| CS61B-Spring-2018相关推荐
- python数据结构与算法——栈、队列与双端队列
栈 栈:是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端进行加入数据和输出数据的运算.没有了位置概念,保证任何时候可以访问.删除的元素都是此前最后存入的那个元素,确定了 ...
- 京东实习生招聘题目解析(一):双端队列的应用
因为前几天开始随意做了一个JD的题目,于是就打算逐步把JD在赛码网上的5-3星难度的题目做完,比较有价值的题目会有比较详细的分析过程,其余的就阐述重点或简单带过即可.因为5星难度题目只有两个,就倒着来 ...
- 数据结构之队列、双端队列
数据结构之队列.双端队列 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First in First Out)的线性表,简称FIFO.允许插入的 ...
- 经典数据结构和算法 双端队列 java
选一个简单的数据结构聊一聊,话说有很多数据结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是 栈和队列的组合体. 一:概念 我们知道普通队列是限制级的一端进,另一端出的 ...
- 数据结构与算法笔记(五)——队列(FIFO队列、双端队列)
一.FIFO队列 1.1.概念 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First In First Out)的线性表,简称FIFO.允许 ...
- 【数据结构】队列-顺序队列、循环队列、链队、双端队列
定义 队列是只允许在一端进行插入,而在另一端进行删除的线性表. 队头(Front):允许删除的一端,又称为队首. 队尾(Rear): 允许插入的一端. 先进入队列的元素必然先离开队列,即先进先出(Fi ...
- Python数据结构学习笔记——队列和双端队列
目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...
- 数据结构--队列、双端队列实际举例详解(Python代码)
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请 ...
- python 判断div 之间的内容是否为空_python实现数据结构与算法之双端队列实现
简介 双端队列(deque, double-ended queue),是一种具有队列和栈的性质的数据结构.双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行.双端队列可以在队列任意一端 ...
最新文章
- android代码修改excel文件格式,Android实现类似execel的表格 能回显并能修改表格内容的方法...
- JavaMelody 1.77.0 发布,Java 应用监控平台
- Spring Security之短信登录
- vtk类之vtkFixedPointVolumeRayCastMapper :一个固定像素点的体数据映射器
- Linux结构体变量报错,23. Linux模式设计
- tp5怎么生成短链接_请问在tp5中怎样才能使用url函数?
- deepin更新启动项_Deepin系统更新的两大方法
- 【tyvj】【dp】回文词(IOI2000)
- 7.企业安全建设指南(金融行业安全架构与技术实践) --- 外包安全管理
- pip更新导致ImportError: cannot import name ‘InvalidSchemeCombination‘ from ‘pip._internal.exceptions‘
- PowerPoint优点全体验
- 你电脑上「最引以为豪」的软件是什么?
- ybt1373 鱼塘钓鱼
- 笔记本网络带宽叠加(有线和WiFi同时使用) 2021-09-27
- 2020软件测试学习自学路线分享,附完整资料,绝对有用哟
- 二本考中南计算机学硕,二本考上中南财经政法大学经济法学硕的经验
- 浏览器中访问本地文件for mac
- 有没有人拼团csdn学习会员~~
- 《C语言程序教程》课后编程题
- JAVA父类引用指向子类的对象是什么意思?有什么作用?