目录

  • 一、Queue
  • 1、什么是队列(Queue)
  • 2、方法
  • 3、代码实现
  • 4、运行结果
  • 二、Deque
  • 1、什么是双端队列(Deque)
  • 2、方法
  • 3、代码实现
  • 4、运行结果



一、Queue

1、什么是队列(Queue)

  • 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
  • LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

2、方法

lua 队列 队列的poll方法_双端队列

  • offer,add 区别:

一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

  • poll,remove 区别:

remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

  • peek,element区别:

element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。


3、代码实现

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author :浪漫不死
 * @version: 	1.0
 * @description:队列
 * @date : 2020/11/13 16:15
 */

//poll()    检索并移除此队列的头,或返回 null如果队列为空。
//remove()  检索和删除此队列的头。
//element() 检索,但不删除此队列的头。
//offer(E e)如果可能立即在不违反容量限制的情况下这样做的话,将指定的元素插入到队列中。
//peek()    检索,但不删除,这个队列头,或返回 null如果队列为空。

public class QueueDemo {
    public static void main(String[] args) {
        //add()和remove()方法在失败的时候会抛出异常(不推荐)
        Queue<String> queue = new LinkedList<String>();
        //添加元素
        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        queue.offer("d");
        queue.offer("e");
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("=======");
        System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("=======");
        System.out.println("element="+queue.element()); //返回第一个元素
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("=======");
        System.out.println("peek="+queue.peek()); //返回第一个元素
        for(String q : queue){
            System.out.println(q);
        }
    }
}

4、运行结果

lua 队列 队列的poll方法_java_02


二、Deque

1、什么是双端队列(Deque)

  • 名称 Deque 是double ended queue(双端队列) 的缩写。
  • 是一种具有队列的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
  • lua 队列 队列的poll方法_java_03

  • 大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
  • lua 队列 队列的poll方法_队列_04

2、方法

此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。因为此接口继承了队列接口Queue,所以其每种方法也存在两种形式一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。

lua 队列 队列的poll方法_lua 队列_05

此接口扩展了 Queue 接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从Queue 接口继承的方法完全等效于 Deque 方法,如下表所示:

lua 队列 队列的poll方法_队列_06


双端队列也可用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于Deque 方法,如下表所示:

lua 队列 队列的poll方法_双端队列_07


注意,在将双端队列用作队列或堆栈时,peek 方法同样正常工作;无论哪种情况下,都从双端队列的开头抽取元素。

此接口提供了两种移除内部元素的方法:removeFirstOccurrence 和 removeLastOccurrence。
与 List 接口不同,此接口不支持通过索引访问元素。

虽然 Deque 实现没有严格要求禁止插入 null 元素,但建议最好这样做。建议任何事实上允许 null 元素的 Deque 实现用户最好不 要利用插入 null 的功能。这是因为各种方法会将null 用作特殊的返回值来指示双端队列为空。

Deque 实现通常不定义基于元素的 equals 和 hashCode 方法,而是从 Object 类继承基于身份的equals 和 hashCode 方法。


3、代码实现

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

/**
 * @author :浪漫不死
 * @version:	1.0
 * @description: 双端队列
 * @date : 2020/11/13 16:29
 */
 
public class DequeDemo {
    public static void main(String[] args) {
        Deque<Integer> deque = new LinkedList<>();
        deque.addFirst(1);
        deque.addFirst(2);
        deque.addFirst(3);
        deque.addFirst(4);
        deque.addLast(5);
        deque.addLast(6);
        deque.addLast(7);

        while (!deque.isEmpty()) {
            if(!deque.isEmpty()) {
                System.out.println(deque.getFirst());
            }
            if(!deque.isEmpty()) {
                System.out.println(deque.removeFirst());
            }
            if(!deque.isEmpty()) {
                System.out.println(deque.getLast());
            }
            if(!deque.isEmpty()) {
                System.out.println(deque.removeLast());
            }
        }
    }
}

4、运行结果

lua 队列 队列的poll方法_lua 队列_08