在 java 中,deque
(双端队列)是一个支持在两端插入和删除的队列。它是 java collections framework 的一部分,通过接口和实现类提供了高效的双端操作能力。
deque 基础概念
deque
是 双端队列,支持在队列的 头部 和 尾部 添加、删除、访问元素。- 它继承自
queue
接口,是一种更加通用的数据结构。 - 既可以用作 队列(fifo),也可以用作 栈(lifo)。
接口定义
deque
是一个接口,常用实现类有:
arraydeque
:基于动态数组的双端队列实现。linkedlist
:基于双向链表的双端队列实现。
常见操作分类
- 头部操作:
addfirst
、removefirst
、getfirst
- 尾部操作:
addlast
、removelast
、getlast
- 通用队列操作:
offer
、poll
、peek
deque 的方法详解
1. 添加元素
在头部添加:
void addfirst(e e)
:在队列头部插入元素,若队列满则抛出异常。boolean offerfirst(e e)
:在队列头部插入元素,若队列满返回false
。
在尾部添加:
void addlast(e e)
:在队列尾部插入元素,若队列满则抛出异常。boolean offerlast(e e)
:在队列尾部插入元素,若队列满返回false
。
示例:
deque<integer> deque = new arraydeque<>(); deque.addfirst(1); // 在头部添加 deque.addlast(2); // 在尾部添加 system.out.println(deque); // 输出:[1, 2]
2. 删除元素
从头部删除:
e removefirst()
:删除并返回头部元素,若队列为空则抛出异常。e pollfirst()
:删除并返回头部元素,若队列为空返回null
。
从尾部删除:
e removelast()
:删除并返回尾部元素,若队列为空则抛出异常。e polllast()
:删除并返回尾部元素,若队列为空返回null
。
示例:
deque<integer> deque = new arraydeque<>(); deque.addfirst(1); deque.addlast(2); deque.removefirst(); // 删除头部元素 deque.removelast(); // 删除尾部元素 system.out.println(deque); // 输出:[]
3. 访问元素
访问头部元素:
e getfirst()
:获取但不删除头部元素,若队列为空则抛出异常。e peekfirst()
:获取但不删除头部元素,若队列为空返回null
。
访问尾部元素:
e getlast()
:获取但不删除尾部元素,若队列为空则抛出异常。e peeklast()
:获取但不删除尾部元素,若队列为空返回null
。 示例:
deque<integer> deque = new arraydeque<>(); deque.addfirst(1); deque.addlast(2); system.out.println(deque.getfirst()); // 输出:1 system.out.println(deque.getlast()); // 输出:2
4. 栈操作(lifo)
void push(e e)
:将元素压入栈顶(相当于addfirst
)。e pop()
:移除并返回栈顶元素(相当于removefirst
)。
示例:
deque<integer> stack = new arraydeque<>(); stack.push(1); // 压入栈顶 stack.push(2); system.out.println(stack.pop()); // 弹出栈顶元素,输出:2 system.out.println(stack.pop()); // 输出:1
5. 队列操作(fifo)
boolean offer(e e)
:将元素添加到队列尾部(相当于offerlast
)。e poll()
:移除并返回队列头部元素(相当于pollfirst
)。e peek()
:获取但不删除队列头部元素(相当于peekfirst
)。
示例:
deque<integer> queue = new arraydeque<>(); queue.offer(1); // 添加到尾部 queue.offer(2); system.out.println(queue.poll()); // 移除头部元素,输出:1 system.out.println(queue.peek()); // 获取头部元素,输出:2
6. 删除所有元素
void clear()
:清空队列。
示例:
deque<integer> deque = new arraydeque<>(); deque.add(1); deque.add(2); deque.clear(); // 清空队列 system.out.println(deque.isempty()); // 输出:true
7. 检查队列状态
boolean isempty()
:检查队列是否为空。int size()
:返回队列中元素的数量。
deque 的实现类
1. arraydeque
- 基于动态数组实现。
- 特点:
- 适合用作栈和队列。
- 线程不安全,但效率较高。
- 不允许存储
null
元素。
示例:
deque<integer> deque = new arraydeque<>(); deque.addfirst(1); deque.addlast(2); system.out.println(deque); // 输出:[1, 2]
2. linkedlist
- 基于双向链表实现。
- 特点:
- 支持队列和栈操作。
- 允许存储
null
元素。 - 适合频繁插入和删除操作的场景。
示例:
deque<integer> deque = new linkedlist<>(); deque.addfirst(1); deque.addlast(2); system.out.println(deque); // 输出:[1, 2]
常见应用场景
1. 栈实现(lifo 模式)
deque 提供了 push
和 pop
方法,可以方便地模拟栈。
示例:
deque<integer> stack = new arraydeque<>(); stack.push(1); stack.push(2); system.out.println(stack.pop()); // 输出:2 system.out.println(stack.pop()); // 输出:1
2. 队列实现(fifo 模式)
deque 提供了 offer
和 poll
方法,可以模拟队列操作。
示例:
deque<integer> queue = new arraydeque<>(); queue.offer(1); queue.offer(2); system.out.println(queue.poll()); // 输出:1 system.out.println(queue.poll()); // 输出:2
3. 滑动窗口
deque 可以用作维护滑动窗口的数据结构,例如最大值或最小值的计算。
4. 双端处理
deque 支持从两端同时处理数据,例如支持同时从头尾访问元素的算法(如回文检查)。
总结
方法分类 | 常用方法 | 描述 |
---|---|---|
添加元素 | addfirst 、addlast 、offer | 向头部或尾部添加元素 |
删除元素 | removefirst 、removelast | 从头部或尾部删除元素 |
访问元素 | getfirst 、getlast 、peek | 获取头部或尾部元素,但不删除 |
栈操作 | push 、pop | 用作栈的 lifo 操作 |
队列操作 | offer 、poll 、peek | 用作队列的 fifo 操作 |
清空队列 | clear | 删除所有元素 |
推荐使用场景
- 对于简单的栈或队列操作,使用
arraydeque
。 - 对于需要频繁插入、删除或允许存储
null
的场景,选择linkedlist
。
deque
是一个功能强大的双端数据结构,在队列和栈操作中非常灵活。根据实际需求选择实现类即可。
到此这篇关于java deque 详解的文章就介绍到这了,更多相关java deque 详解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论