1.Deque的概念
双向队列:支持在首尾插入和删除元素的线性集合。它具有既具有FIFO(先进先出)特点又具有LIFO(后进先出)的特点,即是队列又是栈;
java官方文档推荐用deque实现栈(stack)。
在Java中,Queue的实现类一般都是用LinkedList。
特点:
- 1.插入、删除、获取操作支持两种形式:快速失败和返回null或true/false
- 2.既具有FIFO特点又具有LIFO特点,即是队列又是栈
- 3.不推荐插入null元素,null作为特定返回值表示队列为空
- 4.未定义基于元素相等的equals和hashCode
2.双端队列操作
插入元素
方法名 | 描述 |
---|---|
addFirst() | 向队头插入元素,如果元素为空,则发生空指针异常 |
addLast() | 向队尾插入元素,如果为空,则发生空指针异常 |
offerFirst() | 向队头插入元素,如果插入成功返回true,否则返回false |
addLast() | 向队尾插入元素,如果插入成功返回true,否则返回false |
删除元素
方法名 | 描述 |
---|---|
removeFirst() | 返回并移除队头元素,如果该元素是null,则发生NoSuchElementException |
removeLast() | 返回并移除队尾元素,如果该元素是null,则发生NoSuchElementException |
offerFirst() | 返回并移除队头元素,如果队列无元素,则返回null |
pollLast() | 返回并移除队尾元素,如果队列无元素,则返回null |
获取元素
方法名 | 描述 |
---|---|
getFirst() | 获取队头元素但不移除,如果队列无元素,则发生NoSuchElementException |
getLast() | 获取队尾元素但不移除,如果队列无元素,则发生NoSuchElementException |
peekFirst() | 获取队头元素但不移除,如果队列无元素,则返回null |
peekLast() | 获取队尾元素但不移除,如果队列无元素,则返回null |
栈操作
方法名 | 描述 |
---|---|
pop() | 弹出栈中元素,也就是返回并移除队头元素,等价于removeFirst(),如果队列无元素,则发生NoSuchElementException |
push() | 向栈中压入元素,也就是向队头增加元素,等价于addFirst(),如果元素为null,则发生NPE,如果栈空间受到限制,则发生IllegalStateException |
判断为空条件
方法名 | 描述 |
---|---|
isEmpty() | 于检查此双端队列是“空”还是“非空”,不会引发异常 |
主要实现类:
ArrayDeque: 基于数组实现的线性双向队列
LinkedList: 基于链表实现的链式双向队列
3.双端队列演示示例
public static void main(String[] args) {
Deque<Integer> deque=new LinkedList<Integer>();
deque.offerLast(10);
deque.offerLast(15);
deque.offerLast(20);
deque.offerFirst(5);
System.out.println("弹出队首元素"+deque.pollFirst());
System.out.println("弹出队尾元素"+deque.pollLast());
System.out.println("查看此时队尾元素"+deque.peekLast());
System.out.println("判断队列是否为空"+deque.isEmpty());
}
4.双端队列典型应用(滑动窗口/单调栈问题)
单调队列问题
剑指 Offer 59 - I. 滑动窗口的最大值