enqueue
與push
、dequeue
與pop
、first
與peek
的操做效果類似。非環形數組實現的元素移位會產生O(n)的複雜度,環形數組能夠避免元素移位的須要。html
用於實現數組集合的數據結構與集合自己的匹配是很是重要的。固定數組實現策略對棧是高效的,是由於全部的活動(添加和刪除元素)都是在集合的一端進行的,於是也是數組在數組的一端進行的。而對於隊列,是在其兩端進行操做的,而順序也就可有可無的了。前端
問題1解決方案:整形變量front(head)和整形變量rear(tail)是從數組兩端開始的索引值,當元素出隊列,front的值要遞減;當元素入隊列,rear的值要遞增。可是,在數組的最後一個單元時,該元素被刪除後front的值從新回到0;填充該元素後rear的值從新回到0。因此,當該隊列爲空時均爲0;該隊列全滿時均爲最大容量。java
- 環形數組與普通數組同樣在容量達到最滿時須要擴容來添加新的元素
- 一個隊列的初始狀態,front和rear都指向初始位置(索引爲0處)。front永遠指向該隊列的隊頭元素,rear則指向該隊列最後一個元素的下一位置。
- 當元素入隊時在隊末進行添加,rear的值逐漸增大,front的值保持不變。
- 當元素出隊時在隊前進行刪除,front的值逐漸增大,rear的值保持不變。
- 判斷隊滿和隊空的條件:
(rear + 1) % array.length = front
,咱們就認爲隊滿;front = rear
- rear指向了隊尾的後一個位置,也就是新元素將要被插入的位置,若是該位置和front相等了,那麼必然說明當前狀態已經不能容納一個元素入隊(間接的說明隊滿)。由於這種狀況是和隊空的判斷條件是同樣的,因此咱們選擇捨棄一個節點位置,rear指向下一個元素的位置,咱們使用rear + 1判斷下一個元素插入以後,是否還能再加入一個元素,若是不能了說明隊列滿,不能容納當前元素入隊(其實還剩下一個空位置),rear經過取模,迴歸到初始位置,咱們判斷rear + 1是否等於front,若是等於說明隊滿,不容許入隊操做,固然這是犧牲了一個節點位置來實現和判斷隊空的條件進行區分。
問題1的解決方案:鏈表實現的隊列須要一個頭結點,一個尾結點,以及計數的變量。數組實現的隊列須要三個整型變量。git
- enqueue:向隊列末端添加一個元素
- 數組:先判斷環形數組是否已滿,未滿的狀況下能夠直接插在下一個可用位置,滿的條件下能夠進行擴容,在插入可用位置便可。與普通數組不一樣的是,在索引值最大時尾部整型變量必須爲零。
rear = (rear + 1) % queue.length
經過求餘回到0。- 鏈表:先判斷隊列是否爲空,若是隊列爲空頭結點也要指向添加元素;若是隊列不爲空,把原鏈表末尾的結點指向新元素,新元素的位置做爲尾結點。
- dequeue:從隊列前端刪除一個元素
- 數組:判斷環形數組是否爲空,若是爲空則拋出異常;若是不爲空則從索引數最小的開始輸出。與enqueue方法相似,在索引值最大的被刪除後頭部整形變量必須爲零。
- 鏈表:判斷鏈表是否爲空,若是爲空則拋出異常;若是不爲空則調出頭結點的內容,而後讓頭結點的下一個做爲頭結點。
- first:考察隊列前端的那個元素
- 數組:直接輸出環形數組的頭部整形變量索引值的內容。
- 鏈表:直接輸出鏈表的頭結點的內容。
- dequeue與first的區別就是在於隊列前端元素的移除和查看。
- isEmpty:斷定隊列是否爲空
- 數組:判斷頭部整形變量和尾部整形變量是否相等,相等爲空。
- 鏈表:判斷鏈表的元素計數器count變量是否爲0,
count = 0
爲空。
- toString:
- 數組:從頭部整形變量開始輸出至尾部整形變量。
- 鏈表:從鏈表的頭部開始往尾部進行不斷輸出。
// 判斷售票口隊伍是否爲空 while(!(costomerQueue.isEmpty())){ for(int count = 0; count <= cashiers; count++){ if(!(costomerQueue.isEmpty())){ //隊伍不空的話,就取出一位顧客(出隊) costomer = costomerQueue.dequeue(); //顧客來的時間和售票口的服務時間相比肯定是否空閒以及服務 if(costomer.getArrivalTime() > cashierTime[count]){ //空閒,能夠服務 departs = costomer.getArrivalTime() + PROCESS; }else{ //無空閒,需排隊等待 departs = cashierTime[count] + PROCESS; } costomer.setDepartureTime(departs); cashierTime[count] = departs; totalTime += costomer.totalTime(); } } }
本週沒有錯題......編程
本週結對學習狀況
20172314方藝雯
20172323王禹涵數組
結對學習內容:鏈表和數組實現隊列數據結構
第五章的內容相對三四章的知識點要少不少,學起來不是很難。因此,中秋節玩的很開心(ง •̀_•́)ง!!可是老師說的雙向鏈表和把兩個鏈表合在一塊兒的的相關代碼尚未嘗試。算是偷懶了...之後抽時間補上吧!架構
補充做業:在你一輩子中身體最健康、最旺盛的時候,能在大學學習和研究,是一輩子中少有的機會。請說明一下,你以及具有的專業知識、技能、能力上還差距哪些?請看這個技能調查表,從表中抽取5-7項你認爲對你特別重要的技能,記下你目前的水平,和你想在課程結束後達到的水平(必須列出5項)。連接模塊化
- 1.Programming:Design(架構設計、模塊化設計、接口設計) now: 3 ---- expectation: 9
- 2.Programming :Code Review / Code Quality(代碼複審、代碼規範、代碼質量) now: 4 ---- expectation: 9
- 3.Programming :Overall(對編程總體的理解) now:3 ---- expectation:9
- 4.Programming :Test(單元測試、代碼覆蓋率) now: 4 ---- expectation: 8
- 5.Supporting Knowledge(幫助軟件開發工做的其餘技能)now:2 ---- expectation:8
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 15/15 | |
第二週 | 703/703 | 1/2 | 20/35 | |
第三週 | 762/1465 | 1/3 | 20/55 |