赞
踩
知道了双端队列的定义,下面我们来了解一下Java API中的Deque类,知道双端队列是如何创建以及使用的
从中我们可以知道,双端队列完全可以当做栈以及队列使用,栈以及队列中的增删查等方法在双端队列中均有方法与之对应实现
可以看到Deque类是一个接口,实现一个接口我们要重写接口中的所有方法。但Deque同时也实现了LinkedList类,因此创建Deque类我们可以new LinkedList类。
我们知道了Deque类中的一些方法,下面我们就来创建一个双端队列,知道其是如何创建使用的吧
知道了如何使用双端队列,下面我们就来实现一下其中的各个方法吧。下面将基于链表以及数组来分别实现
双端队列的添加方法(头部,尾部),我们需要知道要插入位置的头节点以及尾节点,因此使用双向环形链表实现要方便许多
如图所示便为一个双向循环链表
创建一个双向循环链表节点,我们需要一个指向前一个节点的指针(pre)以及指向后面节点的指针( next)
我们需要一个头部哨兵节点sentinel,方便我们获取队首元素(sentinel.next)以及队尾元素(sentinel. pre)
思路:向队列头部添加元素,首先我们需要获取哨兵节点sentinel以及头部节点( sentinel.next),再创建一个新节点,更新对应的指针即可
思路:向队列尾部添加元素,首先我们需要获取哨兵节点sentinel以及尾部节点( sentinel.pre),再创建一个新节点,更新对应的指针即可
思路:首先要获取哨兵节点(sentinel)以及头部节点的下一个节点( sentinel.next.next),最后更新对应的指针即可
思路:首先获取尾部节点的前一个节点( sentinel. pre.pre)以及哨兵节点( sentinel),最后更新相应指针即可
思路:直接返回队首元素( sentinel.next.val)
思路:直接返回队尾元素( sentinel.pre.val)
在一个数组中进行添加删除操作是比较麻烦的。还记得我们在队列的数组实现中,有一种循环数组,可以很方便的完成添加以及删除等操作
基于循环数组,那我们就需要一个头指针( head)以及尾指针( tail),其中尾指针( tail)指向的位置并不插入元素,也就是下一次尾补要插入的位置。我们初始化数组arr的容量为10,head=tail=0
首先我们要知道循环数组的指针head以及tail,大小不同判断也不同
①当head<tail时
②当head>tail时
在循环数组实现的队列中,我们移动头尾指针时,使用的是取模的方法。下面我们来使用一种新的方法来获取移动的指针
移动时,超出边界,获取的指针会不同
①向右移动
Ⅰ.未超出右边界,传入的位置+1
Ⅱ.超出右边界时,传入的位置=0即可(进行循环)
②向左移动
Ⅰ.未超出左边界时,传入的位置-1
Ⅱ.超出左边界时,传入的位置=数组最后一位索引
思路: head指针前移,在head位置传入要插入的元素
思路:在tail位置传入要插入的元素,再更新tail指针
思路:将head位置的空间置空,更新head指针右移
思路:向左移动tail指针,将tail位置的空间置空
思路:直接返回head位置元素
思路:直接返回tail位置元素
各种方法都写出来了吗?下面我来带入数据爽一下吧
若存在错误,不足之处,望各位指出更正₍˄·͈༝·͈˄*₎◞ ̑̑
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。