棧
java.util;
Stack 類表示后進先出(LIFO)對象堆棧。 它使用五個操作擴展了類Vector,這些操作允許將向量視為堆棧。
Stack<Integer> stack = new Stack<>(); //新建堆棧 stack.push(1) ; // 向stack棧頂壓入一個元素 stack.pop() ; // 從stack中彈出棧頂元素 stack.peek() ; // 查看stack中棧頂元素,不彈出 stack.empty() ; // 判斷stack是否是空棧 stack.search(2) ; // 若該對象存在,返回對象在此堆棧上的從1開始的位置。
// 棧頂元素為對象時,返回1 // 若不存在,則返回-1,
Deque接口及其實現提供了一套更完整,更一致的LIFO堆棧操作,應優先使用此類。
(Deque意為雙端隊列,double ended queue)。具體來說又有ArrayDeuqe和LinkedList兩種具體類來實現,兩者的區別體現在底層分別使用數組和鏈表來實現。
LinkedList 是一個繼承於AbstractSequentialList的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。
LinkedList 實現 List 接口,能對它進行隊列操作。
實現Deque接口,即能將LinkedList當作雙端隊列使用。
當LinkedList被當做棧來使用時,常用api及對應關系如下:
棧方法 等效方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()
empty() isEmpty() //判斷是否為空
隊列
java中雖然有Queue接口,單java並沒有給出具體的隊列實現類,而Java中讓LinkedList類實現了Queue接口,所以使用隊列的時候,一般采用LinkedList。因為LinkedList是雙向鏈表,可以很方便的實現隊列的所有功能。
Queue使用時要盡量避免Collection的add()和remove()方法,而是要使用offer()來加入元素,使用poll()來獲取並移出元素。它們的優點是通過返回值可以判斷成功與否,add()和remove()方法在失敗的時候會拋出異常。 如果要使用前端而不移出該元素,使用element()或者peek()方法。
java中定義隊列 一般這樣定義: Queue<E> queue = new LinkedList<E>();
當采用LinkedList來實現時,api的使用和對用關系如下:
隊列方法 等效方法
offer(e) offer(e)/offerLast(e) //進隊列,將元素加入隊列末尾
poll() poll()/pollFirst() //獲取隊列頭的元素並移除
peek() peek()/peekFirst() //獲取隊列頭的元素 isEmpty() //判斷是否為空
Queue<Integer> queue = new LinkedList<>(); queue.element(); queue.offer(1); queue.poll(); queue.peek();
雙向隊列
Deque <Integer> deque = new LinkedList<>(); deque.offer(1); deque.offer(2); deque.offerFirst(3); deque.pollLast();
小根堆
PriorityQueue類實現了優先隊列,默認是一個小根堆的形式,如果要定義大根堆,需要在初始化的時候加入一個自定義的比較器。
PriorityQueue 實現heap
minHeap:PriorityQueue默認實現小根堆
PriorityQueue<Integer> minHeap = new PriorityQueue<>(); minHeap.offer(8); minHeap.offer(5); minHeap.offer(3); minHeap.offer(4); minHeap.offer(2); while(!minHeap.isEmpty()) { System.out.println(minHeap.poll()); }
class maxComparator implements Comparator<Integer> { @Override public int compare(Integer num1, Integer num2) { return num1 >= num2 ? -1 : 1 ; } } PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new maxComparator()); maxHeap.offer(5); maxHeap.offer(3); maxHeap.offer(4); maxHeap.offer(1); maxHeap.offer(2); while(!maxHeap.isEmpty()) { System.out.println(maxHeap.poll()); }
https://blog.csdn.net/the_rising_sun_/article/details/90245825
https://blog.csdn.net/huangfan322/article/details/52756441
TreeSet
https://www.cnblogs.com/yangyquin/p/5058208.html
