双端队列可在两端进行插入和删除操作,Java中通过实现Deque接口支持该结构,常用ArrayDeque(基于数组,访问快)和LinkedList(基于链表,增删快)实现,前者适用于元素数量固定且访问频繁的场景,后者适合频繁增删且容量变化大的场景;二者在性能上主要差异在于访问速度与内存占用,选择需根据具体需求权衡;此外,还可通过自定义数组、循环数组或第三方库实现双端队列,以满足特定性能或功能要求。
双端队列,顾名思义,就是可以在队列的两端进行插入和删除操作的数据结构。Java中
java.util.Deque
解决方案
Java中,可以使用
ArrayDeque
LinkedList
Deque
ArrayDeque
LinkedList
使用 ArrayDeque 实现双端队列:
立即学习“Java免费学习笔记(深入)”;
import java.util.ArrayDeque; import java.util.Deque; public class ArrayDequeExample { public static void main(String[] args) { Deque<String> deque = new ArrayDeque<>(); // 从队头添加元素 deque.addFirst("Element 1"); deque.offerFirst("Element 0"); // offerFirst不会抛出异常,如果队列满了会返回false // 从队尾添加元素 deque.addLast("Element 2"); deque.offerLast("Element 3"); System.out.println("Deque: " + deque); // 输出: Deque: [Element 0, Element 1, Element 2, Element 3] // 从队头移除元素 String first = deque.removeFirst(); // 如果队列为空,会抛出NoSuchElementException String firstOrNull = deque.pollFirst(); // 如果队列为空,返回null // 从队尾移除元素 String last = deque.removeLast(); // 如果队列为空,会抛出NoSuchElementException String lastOrNull = deque.pollLast(); // 如果队列为空,返回null System.out.println("Removed first: " + first); // 输出: Removed first: Element 0 System.out.println("Removed last: " + last); // 输出: Removed last: Element 3 System.out.println("Deque after removals: " + deque); // 输出: Deque after removals: [Element 1, Element 2] // 检查队列头部元素但不移除 String peekFirst = deque.peekFirst(); String getFirst = deque.getFirst(); // 检查队列尾部元素但不移除 String peekLast = deque.peekLast(); String getLast = deque.getLast(); System.out.println("Peek First: " + peekFirst); // 输出: Peek First: Element 1 System.out.println("Peek Last: " + peekLast); // 输出: Peek Last: Element 2 } }
使用 LinkedList 实现双端队列:
import java.util.Deque; import java.util.LinkedList; public class LinkedListDequeExample { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.addFirst("A"); deque.addLast("B"); deque.push("C"); // 等价于 addFirst deque.offer("D"); // 等价于 addLast System.out.println("Deque: " + deque); // 输出: Deque: [C, A, B, D] System.out.println("Removed first: " + deque.removeFirst()); // 输出: Removed first: C System.out.println("Removed last: " + deque.removeLast()); // 输出: Removed last: D System.out.println("Deque after removals: " + deque); // 输出: Deque after removals: [A, B] System.out.println("Peek first: " + deque.peekFirst()); // 输出: Peek first: A System.out.println("Peek last: " + deque.peekLast()); // 输出: Peek last: B } }
双端队列最大的优势在于灵活性。普通队列只能在一端插入,另一端删除,而双端队列两端都可以进行插入和删除。这种灵活性使得双端队列可以应用于更多场景。
应用场景:
ArrayDeque
LinkedList
Deque
如何选择:
ArrayDeque
LinkedList
ArrayDeque
LinkedList
举个例子,假设你需要实现一个LRU缓存,缓存大小固定,且访问频率很高,那么
ArrayDeque
LinkedList
理论上,任何可以支持两端插入和删除操作的数据结构都可以用来实现双端队列。
选择哪种方式取决于具体的应用场景和需求。如果对性能有极致的要求,可能需要自定义实现。如果只是需要简单的双端队列功能,使用
ArrayDeque
LinkedList
以上就是java代码如何实现队列的双端操作 java代码双端队列的基础实现技巧的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号