欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Queue,Deque,PriorityQueue

程序员文章站 2022-03-31 10:05:03
...

Queue

队列的特点是向末尾添加元素,从队列头删除元素,队列中允许有重复元素。

        1. 加入元素的方法:

boolean add(E element)//E是泛型类型
boolean offer(E element)

如果添加成功返回true。如果队列已满,add()方法会抛出IllegalStateException,offer()方法返回false。
        2. 删除元素的方法:

E remove()
E poll()

如果队列为空,remove()方法会抛出NoSuchElementEcxeption,poll()方法返回null。
        3. 获取元素的方法:

E element()
E peek()

如果队列为空,element()方法抛出NoSuchElementException,peek()方法返回null。

Deque

Deque是Queue的子接口,表示双向队列。可以在队头和队尾添加或删除元素。
        1. 向队头或队尾添加元素的方法:

void addFirst(E element)
void addLast(E element)
boolean offerFirst(E element)
boolean offerLast(E element)

如果队列已满,前2个方法会抛出IllegalStateException,后2个方法返回false。
        2. 从队头或队尾删除元素的方法:

E removeFirst()
E removeLast()
E pollFirst()
E pollLast()

如果队列为空,前2个方法会抛出NoSuchElementEcxeption,后2个方法返回null。
        3. 从队头或队尾获取元素的方法:

E getFirst()
E getLast()
E peekFirst()
E peekLast()

如果队列为空,前2个方法会抛出NoSuchElementEcxeption,后2个方法返回null。

PriorityQueue

PriorityQueue(优先级队列)会按照排序的方式对队列中的元素进行排序和检索。所以加入到PriorityQueue中的对象必须实现Comparable接口,提供对元素排序时的比较规则。

示例:

import java.util.*;
public class Tester {
    public static void main(String[] args) {
        Queue<Integer> pq = new PriorityQueue<>();
        pq.add(13);
        pq.add(24);
        pq.add(10);
        pq.add(30);
        System.out.println("遍历队列:");
        for(Integer e:pq) {
            System.out.print(" "+e);
        }
        System.out.println();
        System.out.println("依次删除队列中的元素:");
        while(pq.isEmpty()==false) {
            System.out.print(" "+pq.remove());
        }
    }
}
/*
  输出结果:
  遍历队列:
 10 24 13 30
依次删除队列中的元素:
 10 13 24 30
 */

        通过foreach遍历时,取得的元素并没有进行排序,而在调用remove()方法时,该方法总会删除当前队列中最小的元素,所以删除结果是10,13,24,30。
        优先级队列的底层实现原理是通过二叉小顶堆实现的(用一棵完全二叉树表示[任意一个非叶子节点的权值都不大于其左右子节点的权值]),所以add()方法执行如下图:
Queue,Deque,PriorityQueue
先加入13,然后加入24,都满足定义,当加入10的时候,10<13,所以10和13位置调换,最后加入30,满足定义。
        遍历输出的时候是采用层次遍历,所以输出结果为10,24,13,30.