当前位置: 代码网 > it编程>编程语言>Java > Java Deque基本概念和使用方法

Java Deque基本概念和使用方法

2025年03月05日 Java 我要评论
在 java 中,deque(双端队列)是一个支持在两端插入和删除的队列。它是 java collections framework 的一部分,通过接口和实现类提供了高效的双端操作能力。deque 基

在 java 中,deque(双端队列)是一个支持在两端插入和删除的队列。它是 java collections framework 的一部分,通过接口和实现类提供了高效的双端操作能力。

deque 基础概念

  • deque双端队列,支持在队列的 头部尾部 添加、删除、访问元素。
  • 它继承自 queue 接口,是一种更加通用的数据结构。
  • 既可以用作 队列(fifo),也可以用作 栈(lifo)

接口定义

deque 是一个接口,常用实现类有:

  • arraydeque:基于动态数组的双端队列实现。
  • linkedlist:基于双向链表的双端队列实现。

常见操作分类

  • 头部操作addfirstremovefirstgetfirst
  • 尾部操作addlastremovelastgetlast
  • ​​​​​​​通用队列操作offerpollpeek

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 提供了 pushpop 方法,可以方便地模拟栈。

示例:

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 提供了 offerpoll 方法,可以模拟队列操作。

示例:

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 支持从两端同时处理数据,例如支持同时从头尾访问元素的算法(如回文检查)。

总结

方法分类常用方法描述
添加元素addfirstaddlastoffer向头部或尾部添加元素
删除元素removefirstremovelast从头部或尾部删除元素
访问元素getfirstgetlastpeek获取头部或尾部元素,但不删除
栈操作pushpop用作栈的 lifo 操作
队列操作offerpollpeek用作队列的 fifo 操作
清空队列clear删除所有元素

推荐使用场景

  • 对于简单的栈或队列操作,使用 arraydeque
  • 对于需要频繁插入、删除或允许存储 null 的场景,选择 linkedlist

deque 是一个功能强大的双端数据结构,在队列和栈操作中非常灵活。根据实际需求选择实现类即可。

到此这篇关于java deque 详解的文章就介绍到这了,更多相关java deque 详解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com