集合中篇—棧與隊列

  • 2020 年 3 月 10 日
  • 筆記

1. 準備

Java的集合實現了棧與隊列,我們直接調用就可以實現功能,可是平時就見過Queue、Stack、Deque這些字眼,完全不知道怎麼回事,下面就來梳理一下他們的關係,先來看類圖(這裡簡化並只關聯了所需要提到的類或接)

  • Stack類(棧),繼承了Vector線程安全類,現在不推薦使用,推薦ArrayDeque
  • Queue接口(隊列),有Collection方法,而且也新增了自己的方法
  • Deque接口(雙向隊列),繼承了Queue,因為是雙向隊列,所以可以實現隊列和棧的操作
  • 我們之前學過的LinkedList以及ArrayDeque實現Deque接口,即可以作為隊列和棧使用

2. Queue

Queue接口不同之處在於同一個功能他有兩套方法,兩套方法區別於一套是實現返回值,另一套是拋出異常

Throw Exception

Return value

增加

add(e)

offer(e)

刪除

remove()

poll()

檢查

element()

peek()

後面講解基於拋出異常的方法

3. Deque

double ended queue,意思是雙向隊列,所以該接口多了操作方法,用於操作頭尾,下面講解部分方法,其餘自行查看

方法

解釋

addFirst(E e)

隊頭增加元素

addLast(E e)

隊尾增加元素

removeFirst()

隊頭刪除元素,並返回該元素

removeLast()

隊尾刪除元素,並返回該元素

peekFirst()

返回隊頭元素,不刪除

peekLast()

返回隊尾元素,不刪除

4. LinkedList

  • 之前我們就學過LinkedList了,底層是雙向鏈表,想不到還支持棧和隊列,而且有了頭尾操作,實現棧和隊列就簡單了,我們比較熟悉他,所以棧和隊列就基於LinkedList來講解
  • 棧和隊列用頭尾操作實現稍微想一下就會理解的,後面列出表格對照

4.1 棧

先進後出的結構,想像成羽毛球筒就行了,先放進去的羽毛球都是最後才能拿出來的

具體實現

public static void main(String[] args) {        LinkedList linkedList = new LinkedList();        linkedList.addFirst(1);      linkedList.addFirst(2);      linkedList.addFirst(3);      linkedList.addFirst(4);        linkedList.removeFirst();        //一定要用foreach方法,上篇有解釋      for(Object i : linkedList){          System.out.println(i);      }  }
3  2  1

4.2 隊列

public static void main(String[] args) {        LinkedList linkedList = new LinkedList();        linkedList.addLast(1);      linkedList.addLast(2);      linkedList.addLast(3);      linkedList.addLast(4);        linkedList.removeFirst();        //一定要用foreach方法,上篇有解釋      for(Object i : linkedList){          System.out.println(i);      }  }
2  3  4

4.3 對照表

功能

方法

進棧

addFirst(e)

出棧

remoceFirst()

取棧頂

peekFirst()

隊列

功能

方法

進隊

addLast(e)

出隊

removeFirst()

取隊首

peekFirst()