20172301 《程序設計與數據結構》第三週學習總結

20172301 《程序設計與數據結構》第三週學習總結

教材學習內容總結

  • 隊列
    • 隊列是一種線性集合,先進先出
    • 元素通常從隊列末端進入,從隊列前端退出。
    • 中,處理過程只在棧的一端進行;在隊列中,處理過程在隊列的兩端進行。
  • API中的隊列
    • Stack類實現了棧集合。卻沒有隊列類。只提供了 Queue接口
    • Stack類提供了基本操做。Queue接口只定義了兩種方法,添加元素和刪除元素。
  • 使用隊列:代碼密鑰(書上代碼雜亂無章)
    詳見教材問題二。
  • 用鏈表實現隊列:
    • 在enqueue操做,在鏈表前端添加新結點,就把新結點的next指針設置爲指向鏈表的head變量,把head變量設置爲指向新結點。複雜度爲O(1)。
    • 在enqueue操做,在鏈表末端添加新結點,就把鏈表末端結點的next指針設置爲指向新結點,而後把鏈表的tail設置爲指向新結點。複雜度爲O(1)。
    • 在dequeue操做,在鏈表前端,設置一個臨時變量指向鏈表前端的元素,而後把front變量設置爲第一個結點的next指針的值。複雜度爲O(1)。
    • 在dequeue操做,在鏈表末端,複雜度爲O(n)
    • 對於單向鏈表,可選擇從末端入列,從前端出列。對於雙向鏈表,無所謂從哪端入列和出列。
  • 用數組實現隊列:
    • 將隊列的某一端固定在數組的索引0處。全部元素會不間斷地存放在數組中。
    • 非環形數組實現的元素移位,將產生O(n)的複雜度。
    • 用固定數組來實現隊列的效率不高。html

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

  • 問題1:Queue接口兩種方法add和offer在異常類處理上有何不一樣。
  • 問題1解決方案:
    根據書上所說前端

    • add操做能夠確保隊列中有給定的元素。若是給定元素沒有添加到隊列中,該操做將拋出一個異常。
    • offer操做把給定元素插入到隊列中,若是插入成功,返回true,不然返回false。

    查詢API所得,
    java

    也就是書上說的一個是提供了一個布爾返回值,另外一個則是拋出一個異常。git

    那麼add方法和offer方法有何不一樣?
    區別:二者都是往隊列尾部插入元素,不一樣的時候,當超出隊列界限的時候,add()方法是拋出異常讓你處理,而offer()方法是直接返回false。
  • 問題2:書上用隊列實現代碼密鑰,代碼的相關理解。
  • 問題2解決過程:
    • 建立一個數組,錄入密鑰值;
    • 把密鑰值分別存放到兩個單獨隊列中。編碼者使用一份密鑰,解碼者使用另外一個密鑰。
    • 經過循環,把字母移動相對應的密鑰的數位,造成新的字符。

      根據其在ASCII表中的位置,相對應的移動幾位,造成新的字符。程序員

    • 輸出加密和解密後字符串。
    • 注意:密鑰在此程序中循環重複使用。
    encodingQueue.add(keyValue);

    好比密鑰是{5,12,-3,8,-9,4,10}
    一次循環返回後便是{12,-3,8,-9,4,10,5}
    一樣,能夠編碼任何字符數組

代碼調試中的問題和解決過程

  • 問題1:PP5.7的實現設計思路。
  • 問題1解決方案:
    • 雙端隊列的實現很容易結合第二章所學的雙向鏈表的相關知識。咱們通常須要維護兩個引用:一個引用指向鏈表的首節點,我定義爲front;另外一個引用指向鏈表的末結點,我定義爲rear同時,鏈表中的每一個結點都應該存有兩個引用。一個指向上一個元素,一個指向下一個元素。因此,咱們須要從新定義一個結點類。
    • 如何處理接口問題?
    • 這裏我首先根據書上的內容查詢了API Deque接口,發現其中包含許多棧和隊列的操做和方法。

      咱們這裏並不須要涉及所有,我認爲只須要基本的頭插,尾插,頭刪,尾刪,以及返回個數,返回頂端,toString的基本操做。
    • 這裏可能有人會說雙端隊列和雙端鏈表並不相同,不能夠直接類比。
    • 通過個人查詢呢,雙端隊列和雙端鏈表確實有所區別。隊列只能對頭尾兩個元素操做。雙向隊列頭尾都可插入,彈出;雙向鏈表則能夠從任何一個元素位置起找到其餘全部元素。可是呢,其實這兩個沒有什麼比較的意義。我也只是類比其設計的思路。
    • 對比單向鏈表的LinkedQueue,具體的方法實現便再也不贅述。
  • 問題2:書P89 dequeue操做代碼中
public T dequeue() throws EmptyCollectionException
    {
        if (isEmpty())
            throw new EmptyCollectionException("queue");

        T result = queue[front];
        queue[rear] = null;
        front = (front+1) % queue.length;

        count--;

        return result;
    }

測試類中,老是刪除隊尾的元素。數據結構

  • 問題2 的解決方案:
    正常來講,隊列應該是從末端進,首端出。可是,我測試dequeue操做卻刪除了尾端的元素。
    這個實際上是書上代碼的錯誤。應該是queue[front] = null意思是把隊列首端設置爲空。這裏的隊列首端並不固定在數組的0索引處,因此也不能經過刪除索引0的元素來達到dequeue的操做。

代碼託管

一些接口在jsjf文件夾中。
單元測試

上週考試錯題總結

  • 上週無測試

結對及互評

  • 上週博客互評狀況
    • 20172304
      • 文筆優秀,代碼問題也很詳細,能夠把改正後的截圖放上去,更加顯得清晰明瞭。
    • 20172328
      • 博客教材總結的很是詳細,理解的也很深刻,不少書上的問題咱們都是相互討論而後得出的結論,不過這周的代碼問題彷佛尚未填充。

其餘

盡信書則不如無書。新的java教材有不少翻譯不恰當和代碼問題,在對書上內容的理解上會有很大的誤差。可是咱們沒法改變書本的好壞,與其抱怨,只能多花時間明白其錯誤在哪裏,杜絕掉其中的代碼錯誤,由於每每是由於一個變量錯誤,結果就是千差萬別。因此,注意細節,是每一個程序員必備的覺悟和素質。代碼如此,人亦如此。學習

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 10/10
第二週 610/610 1/2 20/30
第三週 593/1230 1/3 18/48

補充做業

目前水平(0~9) 課程結束後水平(0~9)
程序理解 3 8
代碼規範/質量 5 9
單元測試/代碼覆蓋率 4 8
模塊實現/逐步細化 5 9
自主學習能力 6 8
協同工做 5 9

現階段,代碼的理解和實現使咱們須要提升的關鍵。更好的理解書上的代碼能夠幫助咱們應用更多的場景模式。而代碼實現的質量則須要日漸積累,這不是一蹴而就的。細節的成敗,一樣是影響代碼的質量,這更應該使咱們所要避免的。咱們應該對咱們編寫的每一份代碼負責。測試

參考資料

相關文章
相關標籤/搜索