天天看點

Queue,Deque,PriorityQueue

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.