20172313 2018-2019-1 《程序設計與數據結構》第三週學習總結

20172313 2018-2019-1 《程序設計與數據結構》第三週學習總結

教材學習內容總結

  • 概述
    • 隊列是一種線性集合,其元素從一端加入,從另外一端刪除;隊列的元素是按FIFO方式處理的。第一個進入的元素,也就是第一個退出的元素。
    • 隊列有隊頭(front)和隊尾(rear),數據從隊尾進入隊列,從隊頭出隊列,隊頭(front)指向隊列的第一個數據,隊尾(rear)指向隊列中的最後一個數據。

  • JavaAPI中的隊列
    • Java集合API提供了java.util.Stack類,它實現了棧集合。但它並無提供隊列類,而是提供了一個Queue接口,由多個類(包括LikedList類)來實現的。
    • java.util.Stack類提供了傳統的push、pop和peek等操做。而Queue接口並無實現傳統的enqueue、dequeue和first操做。Queue接口定義了另外兩種方法,往隊列中添加元素或從隊列中刪除元素。着西方大在異常類處理上有很大的不一樣。一個是提供了一個布爾返回值,另外一個是拋出一個異常。
  • 用鏈表實現隊列
    • 實現隊列時,咱們要操做鏈表的兩端。除了一個指向鏈表首元素的引用(front)以外,還須要跟蹤另外一個指向鏈表末元素的引用(rear)。還要用一個整型變量count來跟蹤隊列中的元素數目。
    • 當建立隊列時隊列中沒有數據,front和rear的值都爲null。當插入第一個數據時,將front和rear都指向第一個結點對象。
    • 後續在插入數據時就利用rear進行數據的插入。
  • 用數組實現隊列
    • 因爲隊列操做會修改集合的兩端,所以將一端固定於索引於0處要求移動元素。
    • 非環形數組實現的元素移位,將產生O(n)的複雜度。
    • 固定數組實現策略在棧的實現中很高效,但在隊列的實現中則不是這樣。這個示例說明,用於實現集合的數據結構與集合自己的匹配是很是重要的。固定數組實現策略對棧是高效的,是由於全部的活動(添加和刪除元素)都是在集合的一端進行的,於是也是在數組的一端進行的。而對於隊列,咱們是在其兩端進行操做的,而順序也不是可有可無的了,所以,用固定數組來實現棧的效率不高。
    • 把數組看做是環形的,能夠除去在隊列的數組實現中把元素移位的須要。實現環形數組有如下兩種方法。
      • 添加一個屬性size用來記錄眼下的元素個數。
        目的是當head=rear的時候。經過size=0仍是size=數組長度。來區分隊列爲空,或者隊列已滿。
      • 數組中僅僅存儲數組大小-1個元素,保證rear轉一圈以後不會和head相等。也就是隊列滿的時候。rear+1=head,中間恰好空一個元素。當rear=head的時候。必定是隊列空了。

隊列的示意圖

實現隊列時,要注意的是假溢出現象。如上圖的最後一幅圖。如圖所看到的的假溢出現象

解決的方法:使用鏈式存儲,這顯然可以。在順序存儲時。咱們常見的解決的方法是把它首尾相接,構成循環隊列。這可以充分利用隊列的存儲空間。
循環隊列示意圖:

在上圖中。front指向隊列中第一個元素。rear指向隊列隊尾的下一個位置。
但依舊存在一個問題:當front和rear指向同一個位置時,這表明的是隊空仍是隊滿呢?你們可以想象下這樣的情景。
解決這種問題的常見作法是:
1.使用一標記,用以區分這樣的易混淆的情形。
2.犧牲一個元素空間。當front和rear相等時,爲空。當rear的下一個位置是front時。爲滿。
例如如下圖:

html

  • 雙端隊列
    • 詳見下面教材問題解決。

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

  • 問題1:在學習教材上的內容時,例題5.3使中使用隊列進行儲存代碼密鑰。在總結中,有這樣一句話:隊列是一種可存儲重複編碼密鑰的便利集合。我對於這句話不是很理解。
  • 問題一解決:隊列的元素是按FIFO方式處理的。第一個進入的元素,也就是第一個退出的元素。只要在用到每一個密鑰值以後將其放回到隊列中便可。隊列的性質使得密鑰值能保持正確的次序;不用擔憂什麼時候抵達密鑰末尾,該如何從頭開始。
  • 問題2:課後自測題:隊列的五種基本操做是什麼?
  • 問題二解決:queue--往隊列末端添加一個元素 dequeue--從隊列前端刪除一個元素 first--返回一個指向隊列前端元素的引用 isEmpty--當隊列爲空時返回true,不然返回false size--返回隊列中元素的數目
  • 問題3:教材在這章的末尾提到了雙端隊列,對於雙端隊列的實現存在一些疑問,不清楚實現隊列時指針的應用。
  • 問題三解決:雙端隊列(deque double ended queue(雙端隊列))是一種相對於隊列的一種數據結構。它能夠在尾部和頭部插入、移除和獲取。和 Queue相似,每一個操做都有兩種方法,一種在異常狀況下直接拋出異常奔潰,另外一種則不會拋異常,而是返回特殊的值,好比 false, null …

    雙端鏈表不一樣於單向鏈表僅有一個指針域指向下一個節點,而是同時持有下一個和上一個指針域,分別指向下一個和上一個節點

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

  • 問題1:在作習題pp5_1的時候,向隊列中添加了兩個不一樣的int型數值,可是輸出的時候兩個都是第一次輸入的數值。
    前端

  • 問題1解決方案:輸出的兩個數值相等,個人第一反應是添加的方法有問題,再添加節點的時候只能爲節點保存相同的數值,再仔細檢查了添加的代碼後,發現是沒有問題的。
public void enqueue(T element) {
        LinearNode<T> node = new LinearNode<T>(element);

        if(isEmpty())
            head = node;
        else
            tail.setNext(node);
        tail = node;
        count ++;

    }
  • 因爲節點的代碼使用的是跟上一張相同的代碼,因此節點也不會有問題,我在debug以後發現,在個人toString方法中指針沒法指向下一個節點,原來我忘記把下一個節點的引用賦值給current節點了,致使打印的時候沒法正常遍歷。

代碼託管

上週考試錯題總結

  • 這周沒有錯題~

結對及互評

  • 博客中值得學習的或問題:
    • 排版精美,對於問題研究得很細緻,解答也很周全。
  • 代碼中值得學習的或問題:
    • 代碼寫的很規範,思路很清晰,繼續加油!

點評過的同窗博客和代碼

其餘(感悟、思考等,可選)

  轉眼間,開學也已經快一個月了,又找到了上學期學習的感受,但因爲中秋假期的影響,仍是感到本身這周的學習時間不太夠,僅僅只完成了教材內容和代碼練習而已,並無去進行更多的拓展學習。我能感到本身狀態有所好轉,可以靜下心來認真看書,專心敲代碼了,但仍是要付出更多的時間才行,繼續加油!java

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
第一週 200/200 1/1 5/20
第二週 981/1181 1/2 15/20
第三週 1694/2875 1/3 15/35
  • 計劃學習時間:15小時node

  • 實際學習時間:15小時git

參考資料

補充做業

  • 感受本身在軟件實現和軟件測試上只是略懂一二,還有不少不會的、不明白的須要學習。效能分析和需求分析也僅僅是接觸的程度而已,至於下面的行業洞察力,項目管理,軟件設計等一系列的東西則瞭解的更是少之又少。對照了這個表,深感本身的學習程度不夠,學習時間不足,還須要付出更多的精力和更大的努力才行。
目前水平 (0~9) 課程結束後水平 (0~9)
對編程整體理解 3 8
程序理解 5 8
模塊實現,逐步細化 2 7
單元測試,代碼覆蓋率 4 8
代碼質量 6 8
相關文章
相關標籤/搜索