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

摘要:

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

相关推荐
昇腾CANN几秒前
TileLang-Ascend 算子性能优化方法与实操
开发语言·javascript·性能优化·昇腾·cann
沐知全栈开发12 分钟前
ionic 手势事件详解
开发语言
lsx20240632 分钟前
Bootstrap 按钮
开发语言
qinqinzhang34 分钟前
Java 中的 IoC、AOP、MVC
java
神仙别闹36 分钟前
基于 Python 实现 BERT 的情感分析模型
开发语言·python·bert
禾叙_41 分钟前
【langchain4j】结构化输出(六)
java·开发语言
NQBJT43 分钟前
VS Code配置Python人工智能开发环境
开发语言·人工智能·vscode·python
饭小猿人1 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
byoass1 小时前
智巢AI知识库深度解析:企业文档管理从大海捞针到精准狙击的进化之路
开发语言·网络·人工智能·安全·c#·云计算
南境十里·墨染春水1 小时前
C++笔记 STL——set
开发语言·c++·笔记