20172305 2018-2019-1 《Java軟件結構與數據結構》第三週學習總結

20172305 2018-2019-1 《Java軟件結構與數據結構》第三週學習總結

教材學習內容總結

本週內容主要爲書第五章內容:

  • 隊列
    • 線性集合(元素從一端加入,另外一端刪除)
    • 先進先出(FIFO)
    • 隊列前端(front)、隊列末端(rear)
  • 隊列與棧的不一樣:
    • 1.隊列(FIFO)是先進先出,棧(LIFO)是後進先出。
    • 2.處理方式:在棧中,只在棧的某一端進行;在隊列中,可在隊列的兩端進行。
    • 3.棧的做用是顛倒順序,隊列的做用是保持順序。
    • 4.常見棧的應用場景包括括號問題的求解,表達式的轉換和求值,函數調用和遞歸實現,深度優先搜索遍歷等;常見的隊列的應用場景包括計算機系統中各類資源的管理,消息緩衝器的管理和廣度優先搜索遍歷等。
  • 隊列與棧的相同:
    • 1.enqueuepushdequeuepopfirstpeek的操做效果類似。
    • 2.不存在直接讓用戶查看隊列或是棧的中部。
    • 3.不存在重組或是刪除多個元素。
    • 4.插入與刪除的時間複雜度都是O(1),在空間複雜度上二者也同樣。
  • 非環形數組實現的元素移位會產生O(n)的複雜度,環形數組能夠避免元素移位的須要。html

  • Java API中的隊列,並無提供隊列類,而是提供一個Queue接口。
    • Queue接口提供了兩個方法add和offer,往隊列中添加元素。add操做能夠確保隊列中含有給定的元素,若是給定元素沒有添加到隊列中,該操做將拋出異常;offer操做把給定元素插入到隊列中,若是插入成功,返回true,不然返回false。
    • Queue接口提供了兩個方法poll和remove,從隊列中刪除元素。當試圖從一個空隊列中刪除一個元素時,發生異常;若是隊列爲空,poll方法返回null,remove方法拋出一個異常。
  • 用於實現數組集合的數據結構與集合自己的匹配是很是重要的。固定數組實現策略對棧是高效的,是由於全部的活動(添加和刪除元素)都是在集合的一端進行的,於是也是數組在數組的一端進行的。而對於隊列,是在其兩端進行操做的,而順序也就可有可無的了。前端

  • 雙端隊列
    • 雙端隊列是一種具備隊列和棧的性質的數據結構。
    • 雙端隊列中的元素能夠從兩端彈出,其限定插入和刪除操做在表的兩端進行。
    • 雙端隊列與棧或隊列相比,是一種多用途的數據結構,在容器類庫中有時會用雙端隊列來提供棧和隊列兩種功能。

教材學習中的問題和解決過程

  • 問題1:環形數組實現過程當中front引用和rear引用的相等問題?與隊列的容量問題?如何判斷隊列已滿?
  • 問題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:enqueue、dequeue、first、isEmpty、size、toString方法的實現
  • 問題1的解決方案:鏈表實現的隊列須要一個頭結點,一個尾結點,以及計數的變量。數組實現的隊列須要三個整型變量。git

    • enqueue:向隊列末端添加一個元素
    • 數組:先判斷環形數組是否已滿,未滿的狀況下能夠直接插在下一個可用位置,滿的條件下能夠進行擴容,在插入可用位置便可。與普通數組不一樣的是,在索引值最大時尾部整型變量必須爲零。rear = (rear + 1) % queue.length經過求餘回到0。
    • 鏈表:先判斷隊列是否爲空,若是隊列爲空頭結點也要指向添加元素;若是隊列不爲空,把原鏈表末尾的結點指向新元素,新元素的位置做爲尾結點。
    • dequeue:從隊列前端刪除一個元素
    • 數組:判斷環形數組是否爲空,若是爲空則拋出異常;若是不爲空則從索引數最小的開始輸出。與enqueue方法相似,在索引值最大的被刪除後頭部整形變量必須爲零。
    • 鏈表:判斷鏈表是否爲空,若是爲空則拋出異常;若是不爲空則調出頭結點的內容,而後讓頭結點的下一個做爲頭結點。
    • first:考察隊列前端的那個元素
    • 數組:直接輸出環形數組的頭部整形變量索引值的內容。
    • 鏈表:直接輸出鏈表的頭結點的內容。
    • dequeue與first的區別就是在於隊列前端元素的移除和查看。
    • isEmpty:斷定隊列是否爲空
    • 數組:判斷頭部整形變量和尾部整形變量是否相等,相等爲空。
    • 鏈表:判斷鏈表的元素計數器count變量是否爲0,count = 0爲空。
    • toString:
    • 數組:從頭部整形變量開始輸出至尾部整形變量。
    • 鏈表:從鏈表的頭部開始往尾部進行不斷輸出。
  • 問題2: 售票口模擬循環代碼理解
  • 問題2的解決辦法:隊列很好的實例化就是現實中的排隊,經過模擬售票口的來進一步解釋隊列的做用。書上代碼模擬1~10個窗口,來求平均用時的。其中,下方的代碼的做用是經過判斷隊列是否有人,若是有人就取出與售票口的服務時間進行對比,空閒則進行服務,不空閒就排隊等待,並記錄總的服務時間。
// 判斷售票口隊伍是否爲空
         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();
                    }
                }
            }
  • 問題3:PP5.1和PP5.2的toString方法
  • 問題3解決方案:ArrayQueue與LinkedQueue的編寫其實很簡單,dequeue和enqueue兩個比較難的方法書上已經給出,比較麻煩的是ArrayQueue的toString方法,輸出的全是刪除的內容,本該顯示的內容卻一個也沒顯示。錯誤的把環形數組的頭當作是零,忽略了環形數組的頭部也是在動的。整形變量front是環形數組的頭,應該從數組的front索引值處開始。
    • 修改前:
    • 修改後:
  • 問題4:PP5.7尾部刪除的相關問題
  • 問題4解決方案:這個編程項目和以前的兩個很像,因此在5.1的基礎上進行改寫的。與隊列不一樣的是兩端的均可以添加或是刪除,因此我在測試以後發現,當鏈表內元素僅有一個的時候,尾部的刪除沒有用。由於我用兩個暫時結點進行循環達到鏈表尾部倒第一和倒第二的內容,可是鏈表元素僅爲一個的時候,一個節點的下一個爲空,還有一個結點根本沒有實際意義。因此,我添加一個追蹤次數的暫時變量,直接越過循環的那種(就是鏈表元素僅剩一個的時候),來肯定在哪一個展現節點後面進行改寫。
    • 代碼以下:

代碼託管

上週考試錯題總結

本週沒有錯題......編程

結對與互評

點評(王禹涵)

  • 博客中值得學習的或問題:
    • 博客中對於鏈表的內容的解釋插入圖片進行理解,直接把書上代碼放上去感受無太大做用。
  • 代碼中值得學習的或問題:
    • 合做探討代碼問題。
  • 基於評分標準,我給本博客打分:6分。
    • 得分狀況以下:
    • 正確使用Markdown語法(加1分)
    • 模板中的要素齊全(加1分)
    • 教材學習中的問題和解決過程, 一個問題加1分
    • 代碼調試中的問題和解決過程, 一個問題加1分
    • 感想,體會不假大空的加1分
    • 點評認真,能指出博客和代碼中的問題的加1分

點評(方藝雯)

  • 博客中值得學習的或問題:
    • 圖片運用恰當,很清晰的解釋了問題和相關內容,第五章總結的特別詳細,建議部分圖片能夠進行一下旋轉。
  • 基於評分標準,我給本博客打分:7分。
  • 得分狀況以下:
    • 正確使用Markdown語法(加1分)
    • 模板中的要素齊全(加1分)
    • 教材學習中的問題和解決過程, 二個問題加2分
    • 代碼調試中的問題和解決過程, 一個問題加1分
    • 感想,體會不假大空的加1分
    • 點評認真,能指出博客和代碼中的問題的加1分

互評對象

感悟

第五章的內容相對三四章的知識點要少不少,學起來不是很難。因此,中秋節玩的很開心(ง •̀_•́)ง!!可是老師說的雙向鏈表和把兩個鏈表合在一塊兒的的相關代碼尚未嘗試。算是偷懶了...之後抽時間補上吧!架構

補充做業

  • 補充做業:在你一輩子中身體最健康、最旺盛的時候,能在大學學習和研究,是一輩子中少有的機會。請說明一下,你以及具有的專業知識、技能、能力上還差距哪些?請看這個技能調查表,從表中抽取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

參考資料

相關文章
相關標籤/搜索