java中的雙端隊列deque使用以及部分原理


直接上代碼吧。

package collections;

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

/**
 * @Package collections
 * @date 2017-11-28下午5:53:32
 */
public class DequeTest {

    /**
     * @param args
     */
    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);
    }

}

結果如下:

隊首取出元素:d
隊列為:[d, e, f]
隊首加入元素后為:[c, d, e, f]
隊尾加入元素后為:[c, d, e, f, g]
隊尾加入元素后為:[c, d, e, f, g, h]
獲取並移除隊列第一個元素后為:[d, e, f, g, h]
獲取並移除隊列最后一個元素后為:[d, e, f, g]
獲取隊列第一個元素為:d
獲取隊列第一個元素后為:[d, e, f, g]
獲取隊列最后一個元素為:g
獲取隊列第一個元素后為:[d, e, f, g]
獲取元素為:d 並刪除
獲取元素為:e 並刪除
獲取元素為:f 並刪除
獲取元素為:g 並刪除
隊列為:[]

繼承關系是:deque => queue => collection=》Iterable

1.使用隊列的時候,new LinkedList的時候為什么用deque接收,不用LinkedList呢?

  答:deque繼承queue接口,因為它有兩個實現,LinkedList與ArrayDeque。用deque接收是因為向上轉型(子類往父類轉,會丟失子類的特殊功能)了。可以試試,用get()方法,LinkedList接收才有。

2.為什么有一個實現還不夠,還弄兩個呢,它們總有區別吧?

  答:ArrayDeque是基於頭尾指針來實現的Deque,意味着不能訪問除第一個和最后一個元素。想訪問得用迭代器,可以正反迭代。

    ArrayDeque一般優於鏈表隊列/雙端隊列,有限數量的垃圾產生(舊數組將被丟棄在擴展),建議使用deque,ArrayDeque優先。

 


免責聲明!

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



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