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

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

min delet 個數 特征 static ... 順序 from 輸出

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

教材學習內容總結

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

一、集合

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

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

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

三、泛型

  • 定義:一種可以存儲、操作和管理在實例化之前沒有指定類型的對象的一個類,通常用作為標識符。
  • 泛型不能被實例化,它只是一個占位符,允許我們去定義管理特定類型的對象的類。

四、棧

  1. 棧的相關概念
  • 棧是一種線性數據結構,采用後進先出(Last in,first out。簡稱LIFO)的方法處理元素
  • 棧的一般方法:
    技術分享圖片
  1. 棧集合
  • Java集合框架中的Stack繼承自Vector:
    • 由於Vector有4個構造函數,加上 Stack本身的一種,也就是說有5種創建Stack的方法
    • 跟Vector一樣,它是數組實現的棧。
  1. 棧ADT
    技術分享圖片

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

一、鏈式結構

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

二、鏈表

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

三、管理鏈表

  • 訪問元素:訪問元素的唯一方法是從第一個元素開始,遍歷整個鏈表直至找到所需元素。
//以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解決方案:如果我們把第一個節點的prev指向最後一個節點,而把最後一個節點的next指向第一個節點,這樣就形成了一個雙向循環鏈表。哨兵結點是個啞元節點,可以簡化邊界條件,使代碼更緊湊,但對速度並沒有什麽幫助。在基於雙向循環鏈表的實現中,可以設置一個啞元節點。這個節點,起哨兵的作用。也就是說它們並不存儲任何實質的數據對象。初始時可以將啞元節點的next指向第一節點,prev指向最後一個節點。

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

  • 問題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頁有這樣一段話:

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

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

結對及互評

點評模板:

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

      點評過的同學博客和代碼

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

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

  • 感覺本周的課本內容不是很條理,總覺得書上的內容東一塊西一塊的,寫教材總結的時候也感覺很沒有感覺,找不到條理的方法和順序來總結。而且因為課上實踐做的不是很好有點受挫,繼續加油吧。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 10/10 1/1 10/10
第二周 246/366 2/3 20/30
  • 計劃學習時間:15小時

  • 實際學習時間:20小時

  • 改進情況:鏈表真skr磨人的小妖精...廢了我半本草稿本

參考資料

  • Java 集合深入理解(13):Stack 棧

  • java文檔註釋--javadoc的用法

  • java中的各個數據結構區別

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