Java双端队列Deque及其应用

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. 滑动窗口的最大值

猜你喜欢

转载自blog.csdn.net/qq_39736597/article/details/113815267
今日推荐