Java中的双端队列(Deque, 全称是double-ended queue)是一种具有队列和栈的性质的抽象数据类型。双端队列中的元素可以从两端弹出(在队列的头部和尾部进行添加或删除操作),因此它既可以作为FIFO(先进先出)的队列使用,也可以作为LIFO(后进先出)的栈使用。
Java在java.util
包中提供了Deque
接口,以及它的几个实现类,如ArrayDeque
(基于数组的双端队列)、LinkedList
(虽然通常用作链表,但它也实现了Deque
接口,因此可以作为双端队列使用)。
Deque接口的主要方法
Deque
接口提供了大量的方法用于从两端进行元素的添加、删除、访问等操作。以下是一些主要的方法:
- 添加元素
void addFirst(E e)
: 在双端队列的开头添加元素。void addLast(E e)
: 在双端队列的末尾添加元素。boolean offerFirst(E e)
: 在双端队列的开头添加一个元素,如果双端队列没有容量限制,则此方法总是返回true
。boolean offerLast(E e)
: 在双端队列的末尾添加一个元素,如果双端队列没有容量限制,则此方法总是返回true
。
- 移除元素
E removeFirst()
: 移除并返回双端队列开头的元素。如果双端队列为空,则抛出NoSuchElementException
。E removeLast()
: 移除并返回双端队列末尾的元素。如果双端队列为空,则抛出NoSuchElementException
。E pollFirst()
: 移除并返回双端队列开头的元素;如果双端队列为空,则返回null
。E pollLast()
: 移除并返回双端队列末尾的元素;如果双端队列为空,则返回null
。
- 访问元素
E getFirst()
: 返回双端队列开头的元素,但不移除它。如果双端队列为空,则抛出NoSuchElementException
。E getLast()
: 返回双端队列末尾的元素,但不移除它。如果双端队列为空,则抛出NoSuchElementException
。E peekFirst()
: 返回双端队列开头的元素,但不移除它;如果双端队列为空,则返回null
。E peekLast()
: 返回双端队列末尾的元素,但不移除它;如果双端队列为空,则返回null
。
- 其他方法
boolean isEmpty()
: 检查双端队列是否为空。int size()
: 返回双端队列中的元素数量。Iterator<E> iterator()
: 返回以正确顺序遍历双端队列中元素的迭代器。Iterator<E> descendingIterator()
: 返回以相反顺序遍历双端队列中元素的迭代器。
使用示例
以下是一个简单的使用ArrayDeque
作为双端队列的示例:
import java.util.ArrayDeque;
import java.util.Deque; public class DequeExample { public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<>(); // 添加元素 deque.addFirst(1); deque.addLast(3); // 访问元素 System.out.println("First: " + deque.getFirst()); System.out.println("Last: " + deque.getLast()); // 移除元素 System.out.println("Removed First: " + deque.removeFirst()); System.out.println("Removed Last: " + deque.removeLast()); // 检查是否为空 System.out.println("Is deque empty? " + deque.isEmpty()); }
}