隊列是一種線性結構,隊列元素按照FIFO方式處理。html
隊列和棧十分類似,因此只須要學習好前面兩個章節就能夠有效地理解「隊列」的基本概念了。node
其方法的功能上能夠大概地一一對應起來
push-->enqueue
pop-->dequeue
peek-->firstgit
因此在最後經過鏈表、數組來實現隊列的問題和實現棧也很是相似,實現起來很是輕鬆。數組
值得注意的是實現隊列時,要注意兩端(front, rear)而非一端(棧中的peek),因此利用固定數組來實現隊列的效率不高,而動態的鏈表會好得多,爲了有效利用數組的空閒空間,書上採用了環形數組的方式。網絡
環形數組的大體概念和原理,能夠藉助以前介紹過的循環鏈表進行理解。從概念上來講,若是數組的最後一個索引後面跟的是第一個索引,那麼該數組就可用做環形數組。數據結構
當front和rear指向同一個位置時,這表明的是隊空仍是隊滿呢?
(圖)學習
爲區分兩種狀況,能夠空出一個元素空間,當rear的下一個位置是front時爲滿,當rear和front位置重合時爲空。
(圖)ui
何以達到循環的目的呢(最後一個索引後面跟着第一個索引)?能夠參照書中的例子:設計
public void enqueue(T element) { if (size() == queue.length) expandCapacity(); queue[rear] = element; rear = (rear+1) % queue.length; count++; } private void expandCapacity() { T[] larger = (T[]) (new Object[queue.length *2]); for (int scan = 0; scan < count; scan++) { larger[scan] = queue[front]; front = (front + 1) % queue.length; } front = 0; rear = count; queue = larger; }
這兩個方法就很好的解釋了環形的實現——經過更新front
和rear
的值。3d
public void chadui(T element) { LinearNode<T> node = new LinearNode<>(element); if (isEmpty()) head = node; else { head.setPrevious(node); head = head.getPrevious(); } count++; }
(圖)
排在後面的人都跑了,看來是隊伍斷了
public void chadui(T element) { LinearNode<T> node = new LinearNode<>(element); if (isEmpty()) head = node; else { node.setNext(head); head.setPrevious(node); head = head.getPrevious(); } count++; }
(圖)
加上node.setNext(head);
連接起來,隊伍重連起來。
(statistics.sh腳本的運行結果截圖)
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 6/6 | |
第二週 | 771/771 | 1/2 | 16/22 | |
第三週 | 562/1233 | 1/3 | 15/37 |
唐才銘19:對書中的知識點總結到位,網絡文章截圖多了一點;
王文彬29:對書上的內容記述詳細,有獨特看法,也在書本的基礎上提出了新問題;引用材料有點長,但本身理解了吧。