20172303 2018-2019-1 《程序設計與數據結構》第2周學習總結

20172303 2018-2019-1 《程序設計與數據結構》第2周學習總結

教材學習內容總結

第3章 集合概述————棧

1、集合

  • 定義:一種彙集、組織了其餘對象的對象
  • 集合的分類
    • 按保存的類型分:
      • 同構:集合中保存的類型所有相同。
      • 異構:集合中能夠保存所有的類型。
    • 按組織的方式分(組織形式由元素添加到集合的次序或元素自身之間的一些內在關係):
      • 線性集合:集合中的元素按直線方式組織。如:隊列集合、棧集合。
      • 非線性集合:集合中的元素不按直線方式組織。如:樹集

2、抽象數據類型(Abstract Data Type, 簡稱ADT)

  • ADT是一種在程序設計語言中還沒有定義其值和操做的數據類型。
  • ADT的抽象性:ADT要對其實現的細節進行定義,而這些定義對於用戶是不可見的。
  • 集合是由對象建立的,對象的內部對於系統其它部分來講是封裝的,所以集合是一種抽象數據類型

3、泛型

  • 定義:一種能夠存儲、操做和管理在實例化以前沒有指定類型的對象的一個類,一般用 做爲標識符。
  • 泛型不能被實例化,它只是一個佔位符,容許咱們去定義管理特定類型的對象的類。

4、棧

  1. 棧的相關概念
  • 棧是一種線性數據結構,採用後進先出(Last in,first out。簡稱LIFO)的方法處理元素
  • 棧的通常方法:
  1. 棧集合
  • Java集合框架中的Stack繼承自Vector:
    • 因爲Vector有4個構造函數,加上 Stack自己的一種,也就是說有5種建立Stack的方法
    • 跟Vector同樣,它是數組實現的棧。
  1. 棧ADT

第4章 鏈式結構————棧

1、鏈式結構

  • 定義:一種使用對象引用變量來建立對象之間的連接的數據結構。
  • 對象引用變量
    • 對象引用變量存放的是對象的地址,表示對象的存儲位置。
    • 一般而言,對象引用變量存放的地址是可有可無的,其最重要的目的是用於訪問對象。

2、鏈表

  • 定義:鏈表是鏈式結構的一種。(鏈表≠鏈式結構)
  • 類型:單鏈表、雙向鏈表、循環鏈表
  • 在鏈表中,對象引用變量也可稱爲指針,鏈表中存儲的對象泛稱爲結點。
  • 結構:
    • 鏈表須要一個單獨的引用變量來做爲鏈表的首結點。
    • 同時,鏈表須要一個從一個對象到另外一個對象的引用變量,又稱做自引用的,一般用next來定義。
    • 鏈表終止於其next引用爲空的結點。

3、管理鏈表

  • 訪問元素:訪問元素的惟一方法是從第一個元素開始,遍歷整個鏈表直至找到所需元素。
//以Person類爲例
Person current = first;
for(int i = 0; i < n(指定整數);i++){
    current = current.next;//遍歷列表
}
  • 插入結點:插入結點須要先設置一個臨時的結點用來防止指針丟失,改變引用順序是其關鍵
//以上課時講的Student類爲例
public static void InsertNode(Student head,Student node1,Student node3){
        Student point = head;
        while((point.number != node1.number) && point != null){
            point = point.next;
        }
        if (point.number == node1.number){
            //此處的兩句絕對不可以換位置,否則可能會形成NullPointerException
            node3.next = point.next;
            point.next = node3;
        }
    }
  • 刪除節點:只要使被刪除結點的前一個指針指向被刪除結點的後一個指針便可。
//仍然以Student類爲例
public static void DeleteNode(Student head,Student node){
        Student pre = head, current = head;
        while (current != null){
            if (current.number != node.number){
                pre = current;
                current = current.next;
            }
        }
        pre.next = current.next;//關鍵步驟
    }
  • 無連接的元素:結點存放的只是存儲位置,要訪問鏈表中存儲的實際元素時最好使用結點對象中的單獨引用來訪問。

集合棧與鏈表棧的比較

  • ArrayStack是基於動態數組的數據結構,LinkedStack基於鏈表的數據結構。
  • 對於隨機訪問和改變操做集合中的元素,ArrayStack要優於LinkedStack,由於LinkedStack要移動指針。
  • 對於新增和刪除操做,LinedStack比較佔優點,由於ArrayStack要移動數據。但這一點要看實際狀況的。若只對單條數據插入或刪除,ArrayStack的速度反而優於LinkedStack。但如果批量隨機的插入刪除數據,LinkedStack的速度大大優於ArrayStack。由於ArrayStack每插入一條數據,要移動插入點及以後的全部數據。

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

  • 問題1:有點不是很明白javadoc的用法以及做用,和使用//或/**/有什麼區別
  • 問題1解決方案:Java中有三種註釋方式。
    • 前兩種分別是//和/**/ ,主要用於代碼的註釋,以此來方便代碼的可讀性。
    • 第三種被稱做說明註釋或文檔註釋,它以 /** 開始,以 */結束,文檔註釋容許你在程序中嵌入關於程序的信息,有了這個註釋就可使用 javadoc 工具軟件來生成信息,並輸出到HTML文件中。
    • 除此以外,我找到一篇博客說明了如何生成javadoc的方法:如何使用javadoc
  • 問題2:書上提到52頁提到的哨兵結點和啞結點是什麼?
  • 問題2解決方案:查了相關資料發現哨兵節點和啞節點好像是一個東西。(關於jie dian究竟是節點仍是結點,雖然書上都用的「結點」,可是我在查資料的時候使用「節點」才能查到相關資料)
    • 哨兵節點(sentinel)是一個啞元節點(dummy node),能夠簡化邊界條件。是一個附加的鏈表節點,該節點做爲第一個節點,它的值域中並不存儲任何東西,只是爲了操做的方便而引入的。若是一個鏈表有哨兵節點的話,那麼線性表的第一個元素應該是鏈表的第二個節點。
    • 帶哨兵節點的鏈表,須要額外的一個節點,但插入和刪除等操做不須要額外的判斷;不帶哨兵節點,在處理鏈表爲空時,和其餘狀況不同,須要單獨判斷一次。
      帶哨兵節點的鏈表,插入或刪除時,不論操做的位置,表頭都不變,不須要額外的判斷;不帶哨兵節點的鏈表,插入或刪除操做發生在第一個節點時,表頭指針都要變化,須要額外的處理。

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

  • 問題1:在作PP3.8時,每次最後顯示的結果都缺最後一個。
  • 問題1解決方案:經過屢次測試發現不是隻缺最後一個,而是缺一部分,一般是一半,後來發現是for循環內的條件有問題,修改後就可以顯示全部元素了。

代碼託管

上週考試錯題總結(正確爲綠色,錯誤爲紅色)

  • 錯題1:Software that is easily portable, can be moved from one computing environment to another with little or no effort.
    • A .True
    • B .Flase
  • 緣由及理解狀況:高質量的軟件通常要具備可移植性,因此當時我以爲不是說只要是軟件就能夠隨意移植,仍是須要一些修改的。可是如今發現是由於當時沒有看到「little"的緣由。
  • 錯題2:An efficient system handles problems gracefully
    • A . True
    • B . False
  • 緣由及理解狀況:質量特徵和描述不匹配,能恰當的解決問題是軟件的健壯性而不是運行效率。
  • 錯題3:Software systems need only to work to support the work of developers, maintainers, and users.
    • A . True
    • B . False
  • 緣由及理解狀況:當時看到這道題的時候其實我不是很肯定,可是看到在書的第7頁有這樣一段話:html

    軟件系統必須通過精心設計、編碼和文檔說明,以便爲開發人員、維護人員和用戶提供支持。java

  • 當時看完以後就以爲好像除了這三種人也沒有其餘的了,可是查了查發現還有系統管理員之類的角色存在。node

結對及互評

點評模板:

  • 博客中值得學習的或問題:
    • 優勢:相較上週在博客內容方面有所改進,望繼續努力。
    • 問題:博客仍是圖文並茂好一些,這樣本身或者別人都看得舒服一些_(:з」∠)_ 對於代碼運行中的問題的整個過程的記錄但願能夠更詳細一些。
  • 代碼中值得學習的或問題:
    • 優勢:代碼相比個人更加簡潔,命名更加規範。
    • 問題:commit相比上學期寫的不是很好。

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20172322
    • 結對學習內容
      • 主要討論了藍墨雲的課堂實踐內容,對於用鏈表實現插入和刪除的功能進行了深刻地探討。

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

  • 感受本週的課本內容不是很條理,總以爲書上的內容東一塊西一塊的,寫教材總結的時候也感受很沒有感受,找不到條理的方法和順序來總結。並且由於課上實踐作的不是很好有點受挫,繼續加油吧。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 10/10 1/1 10/10
第二週 608/618 2/3 20/30
  • 計劃學習時間:15小時
  • 實際學習時間:20小時
  • 改進狀況:鏈表真skr磨人的小妖精...廢了我半本草稿本

參考資料

相關文章
相關標籤/搜索