天天看點

LinkedList的隊列用法

具體的LinkedList資料結構參考這個連結

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

LinkedList的隊列用法
先從下面一段代碼說起吧

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具有隊列的能力。

隊列類似于我們生活中的排隊;特點就是先進先出,在尾部添加元素,從頭部删除元素。

LinkedList的隊列用法

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

LinkedList的隊列用法

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

LinkedList的隊列用法

調用的就是上面的add方法

E remove();删除隊列中頭部元素,如果是空隊列,會抛異常。

LinkedList的隊列用法

E poll();删除頭部元素,如果隊列為空,不會抛異常,會傳回null

LinkedList的隊列用法

E element();檢視頭部資訊,如果空隊列會抛異常

LinkedList的隊列用法

E peek();檢視頭部資訊,空隊列傳回你null

LinkedList的隊列用法

說了了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的資料結構就不相同了

LinkedList的隊列用法

上面的代碼根據方法名結合着Queue的幾個方法名,可以知道具體用法;不做贅述了。

如果把Queue比作排隊的話,那麼Deque就帶插隊的功能了;不光可以在隊尾加元素;還可以在隊頭插入元素;

并且隻能插到隊頭,無法插到隊中間。

我們把Queue稱作隊列,Deque稱作雙端隊列。

隊列和棧資料結構的差別:

1.隊列能操作兩端;而棧隻操作頭部。

2.隊列是先進先出,而棧是先進後出。

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

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

LinkedList的隊列用法

Statck也實作了棧資料的一些方法,但是和Deque是有本質差別的。

LinkedList的隊列用法

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

LinkedList的隊列用法

Statck操作的是數組;LinkedList操作的是連結清單結構的資料。

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

2.另外Deque deque=new LinkedList<>()也可以代替Queue queue=new LinkedList<>();