今日內容:Stack, Queue, Priority Queue, Linked List
import java.util.Stack;
// ...
// Stack<object> name = new Stack<object>();
Stack<Integer> intStack = new Stack<>();
Stack<String> strStack = new Stack<>();
LIFO (Last In First Out),看起來像一個垂直的塔(Vertical tower)
直接print stack可以將stack內的所有元素以陣列形式列出
Stack常見的應用範疇:
// java中的Queue是個interface,需要透過LinkedList或Priority Queue才能實作
import java.util.Queue;
import java.util.LinkedList;
//...
Queue<String> queue = new LinkedList<>();
FIFO (First In First Out),像一個排隊的隊伍,Linear(線性) Data Structure
函式 | 進行例外處理 | 回傳特殊值(例如失敗回傳null或false) |
---|---|---|
插入(尾) | add(item) | offer(item) |
刪除(頭) | remove() | poll() |
查看(頭) | element() | peek() |
由於Queue extends from Collection,所以可以使用Collection這個class裡面的函式
Queue常見的應用範疇:
import java.util.Queue;
import java.util.PriorityQueue;
// ...
Queue<Double> queue = new PriorityQueue<>();
FIFO (First In First Out),就是Queue,但增加了優先級順序
會自動將加入的數值以小到大排序
如果要以大到小排序,可以在PriorityQueue的constructor改成(Collections.reverseOrder())
用於解決ArrayList中,插入與刪除指定節點過久的問題(Array是O(n),而LinkedList是O(1))
而Singly-Linked List包含資料本身與指向下一個節點(Node)的指標,因此不需儲存於連續的記憶體
Java中的LinkedList是Doubly-Linked List,包含前一個節點與後一個節點的指標
並且Java的LinkedList implements Deque(可以想成有兩端的queue),可以在進行插入(addFirst addLast) / 刪除(removeFirst removeLast) / 查看(peekFirst peekLast)
而我們也可以將LinkedList作為Stack或Queue進行使用,意味著可以使用到push, pop, offer, poll這些函式
對於linkedlist,可以使用:
add(index, element),可以直接在第index的位置插入element
remove(element),會遍歷整個linkedlist,然後刪除第一個找到的element
import java.util.LinkedList;
// ...
LinkedList<String> fruits = new LinkedList<>();
fruits.add("Orange");
fruits.add("Grape");
fruits.addFirst("Apple");
// [Apple, Orange, Grape]
fruits.remove("Grape");
// [Apple, Orange]
優點:
缺點:
用途:
今天是學習Java入門資料結構的一天,主要是學到LinkedList怎麼用,可能會在之後的貪食蛇專案中用到,並了解與ArrayList的差異。
今天也是快樂學習的一天,明天繼續!