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

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

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

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

相关内容

热门资讯

wepoke有没有挂(透视)w... wepoke有没有挂(透视)wepoke辅助透视教程(详细辅助技巧教程)好像存在有挂(教你有辅助挂)...
wpk有辅助挂!wpk微扑克真... wpk有辅助挂!wpk微扑克真的(透视)外挂透明挂辅助神器(一向是有挂);支持多人共享记分板与复盘,...
如何分辨真伪!wepkoe有外... 如何分辨真伪!wepkoe有外挂么,wpk有辅助挂,力荐教程(固有是有挂)是一款可以让一直输的玩家,...
微扑克wpk透视辅助(微扑克)... 微扑克wpk透视辅助(微扑克)微扑克有保险吗(透视)本来真的有挂(详细辅助高科技教程)1.微扑克wp...
aapoker透视辅助!aap... aapoker透视辅助!aapoker是谁开发的,(aapoker手游版)原本是有挂(详细辅助202...
玩家必看秘籍!wpk俱乐部怎么... 您好,微扑克辅助机器人这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在...
wepokeai代打的胜率(透... wepokeai代打的胜率(透视)wepoke有挂吗(详细辅助必赢方法)其实真的是有挂(教你辅助);...
aapoker挂!德州aa扑克... aapoker挂!德州aa扑克透明挂,(aapoker开发)其实有挂(详细辅助必胜教程);原来确实真...
wpk俱乐部!wpk发牌为什么... wpk俱乐部!wpk发牌为什么这么离谱(透视)外挂透视辅助软件(原先是有挂);软件透明挂更新新赛季,...
微扑克辅助器ios(微扑克)微... 微扑克辅助器ios(微扑克)微扑克全自动机器人(透视)真是真的是有挂(详细辅助透明挂教程)1、全新机...