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

摘要:

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

相关推荐
侠客行03176 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪6 小时前
深入浅出LangChain4J
java·langchain·llm
灰子学技术8 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚8 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎8 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
二十雨辰8 小时前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码8 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚8 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
熬夜有啥好8 小时前
数据结构——哈希表
数据结构·散列表
你这个代码我看不懂8 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言