《征服数据结构》双端队列

摘要:

1,双端队列的介绍

2,双端队列的数组实现

3,双端队列的链表实现

1,双端队列的介绍

前面我们讲到队列的时候,知道队列是一种先进先出(FIFO, First-In-First-Out)的数据结构,并且它只能在尾部插入,头部删除。而我们今天要讲是双端队列(deque,double-ended queue),就是两端都可以插入和删除的一种数据结构,如下图所示。

双端队列除了队列中间的元素不能操作,两边的元素都可以操作,所以我们既可以把它当作队列来使用,又可以把它当做栈来使用,所以它是一种具有队列和栈的性质的一种数据结构。

双端队列的常见函数如下,这里要注意如果双端队列为空的时候,是不能删除的,也不能获取队列中的元素,具体细节可以看下面的代码。

cs 复制代码
void addFirst(int val)// 在头部添加元素。
void addLast(int val) // 在尾部添加元素。
int pollFirst() // 移除头部元素。
int pollLast() // 移除尾部元素。
int peekFirst() // 获取头部元素,不删除。
int peekLast() // 获取尾部元素,不删除。
int size() // 获取元素的个数。

2,双端队列的数组实现

双端队列既可以用数组实现,也可以用链表实现,在java中使用双端队列常见的有两个类,一个是LinkedList,它是通过链表实现的,还一个是ArrayDeque,他是通过数组实现的。

这两种实现方法都比较简单,其中ArrayDeque中数组的长度必须是 2 的幂次方,这个和HashMap中数组长度一样,主要是为了方便计算。

使用数组实现双端队列也是需要front和rear两个变量,一个是指向队列的头部,一个是指向队列尾部的下一个空闲位置,添加和删除的规则如下:

1,头部添加元素,front往左移。

2,尾部添加元素,rear往右移。

3,头部删除元素,front往右移。

4,尾部删除元素,rear往左移。

因为队列中数组长度是固定的,在元素添加和删除的时候,我们可以把它看作是循环队列,也就是说当 front 指向数组第一个元素的时候,添加之前要让它指向数组的最后一个元素,前提是队列没有满,同理 rear 也一样。

相关推荐
lxp199741几秒前
php函数积累
开发语言·php
科技资讯早知道5 分钟前
java计算机毕设课设—坦克大战游戏
java·开发语言·游戏·毕业设计·课程设计·毕设
白拾15 分钟前
使用Conda管理python环境的指南
开发语言·python·conda
新晓·故知31 分钟前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
从0至141 分钟前
力扣刷题 | 两数之和
c语言·开发语言
总裁余(余登武)42 分钟前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
NormalConfidence_Man42 分钟前
C++新特性汇总
开发语言·c++
一个闪现必杀技1 小时前
Python练习2
开发语言·python
小比卡丘1 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
gorgor在码农1 小时前
Mysql 索引底层数据结构和算法
数据结构·数据库·mysql