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

摘要:

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

相关推荐
007php0077 分钟前
某游戏大厂 Java 面试题深度解析(四)
java·开发语言·python·面试·职场和发展·golang·php
Mr.Jessy9 分钟前
Web APIs学习第一天:获取 DOM 对象
开发语言·前端·javascript·学习·html
午安~婉9 分钟前
javaScript八股问题
开发语言·javascript·原型模式
想不明白的过度思考者16 分钟前
Rust——异步递归深度指南:从问题到解决方案
开发语言·后端·rust
西西学代码1 小时前
Flutter---个人信息(5)---持久化存储
java·javascript·flutter
芝麻开门-新起点1 小时前
flutter 生命周期管理:从 Widget 到 State 的完整解析
开发语言·javascript·ecmascript
陈果然DeepVersion1 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(五)
java·spring boot·kafka·向量数据库·大厂面试·rag·ai智能客服
FAFU_kyp1 小时前
Spring Boot 邮件发送系统 - 从零到精通教程
java·网络·spring boot
脚踏实地的大梦想家1 小时前
【Docker】P2 Docker 命令:从Nginx部署到镜像分享的全流程指南
java·nginx·docker
Blossom.1181 小时前
把AI“编”进草垫:1KB决策树让宠物垫自己报「如厕记录」
java·人工智能·python·算法·决策树·机器学习·宠物