Java [数据结构] Deque与Queue
创始人
2024-11-04 03:41:55
0

🤺深入理解 Java 中的 Deque 和 Queue🤺

在现代软件开发中,数据结构是构建高效、可维护代码的基础。

Java 作为一门广泛应用的编程语言,其丰富的集合框架(Collections Framework)为开发者提供了多种强大的数据结构,其中 Queue(队列)和 Deque(双端队列)尤为常见。本文将深入探讨 Java 中的 QueueDeque,帮助你更好地理解和使用它们来解决实际问题。

队列和双端队列在日常编程中的应用场景非常广泛。无论是任务调度、缓存系统,还是处理广度优先搜索(BFS)算法,队列都能大显身手。而双端队列则进一步扩展了队列的功能,使得数据可以从两端插入和删除,增加了数据处理的灵活性。

本文将从概念、接口方法和具体实现三个方面,详细介绍 QueueDeque 的基本原理及其在 Java 中的具体应用。通过对比这两种数据结构的异同,希望读者能够更好地选择和使用它们,提高程序的性能和可读性。

接下来,让我们首先了解 Queue 的基本概念及其在 Java 中的实现。

Queue(队列)使用Deque

概念

  • 队列是一种先进先出(FIFO,First-In-First-Out)的数据结构。
  • 常用于排队系统,如任务调度、缓冲区等。

主要接口方法

  • boolean add(E e): 将元素添加到队列尾部,如果成功返回 true,如果失败(例如容量限制)抛出异常。
  • boolean offer(E e): 将元素添加到队列尾部,如果成功返回 true,如果失败返回 false。
  • E remove(): 移除并返回队列头部的元素,如果队列为空抛出异常。
  • E poll(): 移除并返回队列头部的元素,如果队列为空返回 null。
  • E element(): 返回队列头部的元素,但不移除它,如果队列为空抛出异常。
  • E peek(): 返回队列头部的元素,但不移除它,如果队列为空返回 null。

实现类

  • LinkedList
  • PriorityQueue
  • ArrayDeque
  • ConcurrentLinkedQueue
  • LinkedBlockingQueue
  • ArrayBlockingQueue

import java.util.Deque; import java.util.ArrayDeque;  public class QueueUsingDequeDemo {      public static void main(String[] args) {         // 创建一个ArrayDeque实例,当作单向队列使用         Deque queue = new ArrayDeque<>();          // 入队操作:在队列尾部添加元素         queue.offer("苹果");         queue.offer("香蕉");         queue.offer("樱桃");          System.out.println("当前队列: " + queue);          // 出队操作:从队列头部移除并获取元素         String firstFruit = queue.poll();         if (firstFruit != null) {             System.out.println("出队元素: " + firstFruit);             System.out.println("出队后队列: " + queue);         } else {             System.out.println("队列为空,无法出队。");         }          // 检查队列是否为空         boolean isEmpty = queue.isEmpty();         System.out.println("队列是否为空? " + isEmpty);     } } 

Deque(双端队列)

概念

  • 双端队列是一种可以在两端进行插入和删除操作的数据结构。
  • 支持既可以作为队列使用(FIFO),也可以作为栈使用(LIFO,Last-In-First-Out)。

主要接口方法

  • 插入操作:
    • void addFirst(E e): 在队列的头部添加元素,如果失败抛出异常。
    • void addLast(E e): 在队列的尾部添加元素,如果失败抛出异常。
    • boolean offerFirst(E e): 在队列的头部添加元素,如果成功返回 true,如果失败返回 false。
    • boolean offerLast(E e): 在队列的尾部添加元素,如果成功返回 true,如果失败返回 false。
  • 移除操作:
    • E removeFirst(): 移除并返回队列头部的元素,如果队列为空抛出异常。
    • E removeLast(): 移除并返回队列尾部的元素,如果队列为空抛出异常。
    • E pollFirst(): 移除并返回队列头部的元素,如果队列为空返回 null。
    • E pollLast(): 移除并返回队列尾部的元素,如果队列为空返回 null。
  • 检查操作:
    • E getFirst(): 返回队列头部的元素,但不移除它,如果队列为空抛出异常。
    • E getLast(): 返回队列尾部的元素,但不移除它,如果队列为空抛出异常。
    • E peekFirst(): 返回队列头部的元素,但不移除它,如果队列为空返回 null。
    • E peekLast(): 返回队列尾部的元素,但不移除它,如果队列为空返回 null。

实现类都可以

  • LinkedList
  • ArrayDeque
  • LinkedBlockingDeque
import java.util.Deque; import java.util.ArrayDeque;  public class DequeDemo {      public static void main(String[] args) {         // 创建一个ArrayDeque实例         Deque deque = new ArrayDeque<>();          deque.addFirst("你好");          // 在队列末尾添加元素         deque.addLast("苹果");         deque.addLast("香蕉");         deque.addLast("樱桃");          System.out.println("初始双端队列: " + deque);          // 在队列开头添加元素         deque.addFirst("火龙果");          System.out.println("在队首添加后: " + deque);          // 从队列开头移除并获取元素         String firstFruit = deque.removeFirst();         String s = deque.pollFirst();          System.out.println("从队首1移除: " + firstFruit);         System.out.println("从队首2移除: " + s);          System.out.println("移除后双端队列: " + deque);          // 从队列末尾移除并获取元素         String lastFruit = deque.removeLast();         System.out.println("从队尾移除: " + lastFruit);         System.out.println("再次移除后双端队列: " + deque);          // 检查双端队列是否为空         boolean isDequeEmpty = deque.isEmpty();         System.out.println("大小" + deque.size());         System.out.println("双端队列是否为空? " + isDequeEmpty);     } } 

总结

  • Queue 适用于需要先进先出的情况,常见实现类如 LinkedListPriorityQueue
  • Deque 提供了更多的灵活性,可以作为队列(FIFO)和栈(LIFO)使用,常见实现类如 LinkedListArrayDeque

觉得有用的话可以点点赞 (*/ω\*),支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

相关内容

热门资讯

技巧辅助挂!pokermast... 技巧辅助挂!pokermaster修改器,丹东约战麻将辅助器,演示教程(有挂细节)1、点击下载安装,...
现场直击!wepokerplu... 现场直击!wepokerplus万能挂,丰城双剑新版最强高分攻略,操作教程(有挂方针)1.丰城双剑新...
插件辅助挂!wepoker有辅... 插件辅助挂!wepoker有辅助器吗,乐平包王攻略,学习教程(有挂方略)1、首先打开乐平包王攻略辅助...
据玩家消息!拱趴大菠萝辅助神器... 据玩家消息!拱趴大菠萝辅助神器,多乐跑得快辅助器,机巧教程(证实有挂)1、在拱趴大菠萝辅助神器插件功...
此事备受玩家关注!来玩app破... 此事备受玩家关注!来玩app破解版,h5能反杀吗,绝活教程(有挂详细)1、打开软件启动之后找到中间准...
值得注意的是!aapoker破... 值得注意的是!aapoker破解侠是真的吗,蜀山四川游戏修改工具,经验教程(有挂助手)1、金币登录送...
第三方辅助!wepoker脚本... 第三方辅助!wepoker脚本,广东星悦有外开挂辅助器吗,法门教程(有挂分析)广东星悦有外开挂辅助器...
此事引发广泛关注!德州透视脚本... 此事引发广泛关注!德州透视脚本,崇阳斗棋辅助脚本视频,诀窍教程(的确有挂)暗藏猫腻,小编详细说明崇阳...
黑科技辅助挂!wepoker买... 黑科技辅助挂!wepoker买脚本靠谱吗,情怀七喜游戏辅助,法门教程(有挂方法)1、每一步都需要思考...
方法辅助挂!aapoker怎么... 方法辅助挂!aapoker怎么设置提高好牌几率,蘑菇云辅助使用视频,绝活儿教程(讲解有挂)1、完成蘑...