Java双端队列

*Java双端队列的知识

Deque 接口是 double ended queue 的缩写,即双端队列,支持在队列的两端插入和删除元素,继承 Queue接口。

public interface Deque extends Queue

Deque 的 12 种方法总结如下:

  • 插入:
    • 如果操作失败则抛出异常
      • void addFirst(Object e)
      • void addLast(Object e)
    • 如果操作失败则返回一个特殊值(nullfalse)
      • boolean offerFirst(Object e)
      • boolean offerLast(Object e);
  • 删除:
    • 如果操作失败则抛出异常
      • Object removeFirst()
      • Object removeLast()
    • 如果操作失败则返回一个特殊值(nullfalse)
      • Object pollFirst()
      • Object pollLast()
  • 获取:
    • 如果操作失败则抛出异常
      • Object getFirst()
      • Object getLast()
    • 如果操作失败则返回一个特殊值(nullfalse)
      • Object peekFirst()
      • Object peekLast()

DequeList 不同,该接口不支持下标访问元素。Deque 的实现并不严格要求禁止插入元素 null,但强烈鼓励不插入 null。任何 Deque 的实现都强烈鼓励不要插入 null,因为 null 是多种方法作为一种特殊返回值来表示 Deque 为空。

ArrayDequeLinkedList 类是 Deque 接口的两个实现类:

  • ArrayDeque 类由数组支持。适合当作堆栈使用。
  • LinkedList 类由链表支持。适合当作FIFO队列使用。

*代码

import java.util.Deque;
import java.util.LinkedList;

public class DequeTest {

    public static void main(String[] args) {
        
        Deque<String> deque = new LinkedList<String>();
        deque.add("d");
        deque.add("e");
        deque.add("f");
        
        //从队首取出元素,不会删除
        System.out.println("队首取出元素:"+deque.peek());
        System.out.println("队列为:"+deque);
        
        //从队首加入元素(队列有容量限制时用,无则用addFirst)
        deque.offerFirst("c");
        System.out.println("队首加入元素后为:"+deque);
        //从队尾加入元素(队列有容量限制时用,无则用addLast)
        deque.offerLast("g");
        System.out.println("队尾加入元素后为:"+deque);
        
        //队尾加入元素
        deque.offer("h");
        System.out.println("队尾加入元素后为:"+deque);
        
        //获取并移除队列第一个元素,pollFirst()也是,区别在于队列为空时,removeFirst会抛出NoSuchElementException异常,后者返回null
        deque.removeFirst();
        System.out.println("获取并移除队列第一个元素后为:"+deque);
        
        //获取并移除队列第一个元素,此方法与pollLast 唯一区别在于队列为空时,removeLast会抛出NoSuchElementException异常,后者返回null
        deque.removeLast();
        System.out.println("获取并移除队列最后一个元素后为:"+deque);
        
        //获取队列第一个元素.此方法与 peekFirst 唯一的不同在于:如果此双端队列为空,它将抛出NoSuchElementException,后者返回null
        System.out.println("获取队列第一个元素为:"+deque.getFirst());
        System.out.println("获取队列第一个元素后为:"+deque);
        
        //获取队列最后一个元素.此方法与 peekLast 唯一的不同在于:如果此双端队列为空,它将抛出NoSuchElementException,后者返回null
        System.out.println("获取队列最后一个元素为:"+deque.getLast());
        System.out.println("获取队列第一个元素后为:"+deque);
        
        //循环获取元素并在队列移除元素
        while(deque.size()>0){
            System.out.println("获取元素为:"+ deque.pop()+" 并删除");
        }
        System.out.println("队列为:"+deque);
    }

}