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

摘要:

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 也一样。

相关推荐
wdfk_prog2 分钟前
lely-canopen-rtt:为什么推荐在 RT-Thread 上使用 Lely CANopen 构建主站
java·运维·缓存·docker·容器
海盗12346 分钟前
DSH 接入 OpenCode Go 报 400 MissingSessionID:从 LLM 语义层退到 fetch 传输层的完整排障
开发语言·后端·golang
Token掘金室7 分钟前
JSON模式结构化输出报错
java·服务器·json
weixin1997010801611 分钟前
《Mercari OTA 直连接入:日本二手电商出海的API通道与600次/分钟限流实战》(附Python源码)
开发语言·数据库·python
秋饼13 分钟前
Spring AI 2.0 接入 DeepSeek V4.1 Flash 生产级实战
java·ai·技术分享·后端开发
IT枫斗者枫哥13 分钟前
Java 分批导出仍然 OOM?用 32 MiB 堆复现三种 CSV 写法
java
库玛西15 分钟前
深度解构高并发利器:纯事件驱动 Reactor 模式的设计哲学与工程实践
服务器·开发语言·c++·笔记·tcp/ip
shehuiyuelaiyuehao22 分钟前
算法43,外观数列,模拟算法+双指针
java·算法
lemon_sjdk27 分钟前
JavaScript 常用关键字全解析
开发语言·javascript·ecmascript
linx29530 分钟前
单元五 · 对称认知·下:编译与链接
linux·c语言·开发语言·c++·嵌入式硬件