雙端隊列Deque使用詳解


介紹Deque

Deque 是JDK 1.6出來的一個新接口,它是一個雙端隊列接口,繼承自Queue接口,Deque的實現類是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。

 

 

Deque有三種用途

  •     普通隊列(一端進另一端出):  Queue queue = new LinkedList()或Deque deque = new LinkedList()
  •     雙端隊列(兩端都可進出):Deque deque = new LinkedList()
  •     堆棧:Deque deque = new LinkedList()

 

 注意:Java堆棧Stack類已經過時,Java官方推薦使用Deque替代Stack使用。Deque堆棧操作方法:push()、pop()、peek()。

 

模擬隊列

Deque接口擴展(繼承)了 Queue 接口。在將雙端隊列用作隊列時,將得到 FIFO(先進先出)行為。將元素添加到雙端隊列的末尾,從雙端隊列的開頭移除元素。從 Queue 接口繼承的方法完全等效於 Deque 方法,如下表所示:

Queue方法 等效Deque方法
add add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()

模擬棧

雙端隊列也可用作 LIFO(后進先出)堆棧。應優先使用此接口而不是遺留 Stack 類。在將雙端隊列用作堆棧時,元素被推入雙端隊列的開頭並從雙端隊列開頭彈出。堆棧方法完全等效於 Deque 方法,如下表所示:

堆棧方法 等效Deque方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()

peek()方法的功能官網源碼描述

 Java代碼實現

public class Main {
    public static void main(String[] args) {
    // 默認構造器
    Deque<String> deque = new LinkedList<>();
    // 先添加的先到尾部
    deque.addFirst("I");
    deque.addFirst("Like");
    deque.addFirst("Java");
    /*
     * 此時deque中元素的位置:
     *     Java
     *     Like
     *     I
     */
    System.out.println("---------get-------");
    System.out.println(deque.getFirst()); // Java  獲取頭
    System.out.println(deque.getLast());  // I     獲取尾
    System.out.println("--------poll-------");
    System.out.println(deque.poll());     // 彈出棧頂元素
    System.out.println("--------push-------");
    deque.push("LanQiao");               // 此時第一個元素為LanQiao
    System.out.println(deque.pollFirst());// 彈出頭   LanQiao
    System.out.println(deque.pollLast()); // 彈出尾   I
    deque.addFirst("LZP");
    System.out.println("--------peek--------");
    System.out.println(deque.peek()); // 等價於peekFirst(),取出隊頭元素,但是隊列中還是存在該元素
    System.out.println(deque.peekFirst());
    System.out.println(deque.peekLast());
    System.out.println(deque.size()); // 長度還是2
    System.out.println("=======real remove=========");
    System.out.println(deque.poll()); // poll才是真正的remove
    System.out.println(deque.size());
    }
}

運行結果

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM