LinkedList的隊列用法


具體的LinkedList數據結構參考這個鏈接

隊列用法主要來自於Deque,而Deque又繼承自Queue

先從下面一段代碼說起吧

public static void main(String[] args) {
Queue<String> queue=new LinkedList<>();
queue.offer("張三");//隊列尾部添加元素
queue.offer("李四");
queue.offer("王五");
while (queue.peek()!=null){//返回頭部信息,不改變隊列
System.out.println(queue.poll());//返回頭部元素,改變隊列
}

 

如果對於隊列的數據結構不了解的話,對上面的注釋內容會比較迷糊。
Queue接口主要是使LinkedList具有隊列的能力。
隊列類似於我們生活中的排隊;特點就是先進先出,在尾部添加元素,從頭部刪除元素。

boolean add(E e);在隊列尾部添加元素;(當隊列滿時,會拋出異常;我從源碼中並沒有看到拋異常的代碼,希望知情者告知一聲)

boolean offer(E e);在隊列尾部添加元素,隊列滿時不會拋異常,只是返回false

調用的就是上面的add方法
E remove();刪除隊列中頭部元素,如果是空隊列,會拋異常。

E poll();刪除頭部元素,如果隊列為空,不會拋異常,會返回null

E element();查看頭部信息,如果空隊列會拋異常

E peek();查看頭部信息,空隊列返回你null

說了了Queue隊列的數據結構,那么Deque具體賦予了LinkeList什么能力了呢。
因為Deque是接口,那么本身並沒有實現Queue方法的能力。所以可以斷定Deque只是擴展了Queue。

Deque<String> deque=new LinkedList<>();
  deque.offer("張三");//隊列尾部添加元素
  deque.offer("李四");
  deque.offer("王五");
  deque.addFirst("老郭");
  deque.addLast("老王");
  while (deque.peek()!=null){//返回頭部信息,不改變隊列
  System.out.print(deque.poll()+" ");//返回頭部元素,改變隊列
//打印結果:老郭 張三 李四 王五 老王
}

 

從上面的代碼我們知道可以在任何地方將元素添加到隊列頭。
這與上面的Queue的數據結構就不相同了

上面的代碼根據方法名結合着Queue的幾個方法名,可以知道具體用法;不做贅述了。
如果把Queue比作排隊的話,那么Deque就帶插隊的功能了;不光可以在隊尾加元素;還可以在隊頭插入元素;
並且只能插到隊頭,無法插到隊中間。
我們把Queue稱作隊列,Deque稱作雙端隊列。
隊列和棧數據結構的區別:
1.隊列能操作兩端;而棧只操作頭部。
2.隊列是先進先出,而棧是先進后出。

從上面的隊列和棧的區別可以發現,他們的實現方法在Deque中都能找到,或者說是雙端隊列的特殊情況。

順便說一下java中沒有單獨的棧接口,但是有一個Stack類;它繼承子Vercor這個類。

Statck也實現了棧數據的一些方法,但是和Deque是有本質區別的。

Statck中添加元素是線程安全的;LinkedList不是線程安全的;

Statck操作的是數組;LinkedList操作的是鏈表結構的數據。


1.在不需要線程安全的情況下,完全可以使用Deque deque=new LinkedList<>()代替。
2.另外Deque deque=new LinkedList<>()也可以代替Queue queue=new LinkedList<>();

 


免責聲明!

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



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