1. 程式人生 > >20172305 2018-2019-1 《Java軟件結構與數據結構》第二周學習總結

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

利用 關系 博客 4.2 官方 clas 標簽 evaluator 頭部

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

教材學習內容總結

本周內容主要為書第三章和第四章的內容:

  • 第三章(以數組來替代棧的作用)

    • 集合(聚集,組織了其他對象的對象):
      • 線性集合(直線方式組織的集合)
      • 非線性集合(某種非直線方式組織的集合)
    • 抽象數據類型是一種在程序設計語言中尚未被定義其值和操作的數據類型。
    • 數據結構是一種用於實現集合的編程結構集。
    • Java集合API是一個類集,表示了一些特定類型的集合。
      • 線性集合
      • 後進先出(LIFO)
      • 棧的基本使用就是用於顛倒順序
    • 面向對象的三個基本特征是:封裝、繼承、多態
      • 封裝,就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。(private、public、protected三者的可見性)
      • 繼承,從現有類派生新類的過程,無需重新編寫原來的類的情況下對這些功能進行擴展,一種強有力的軟件開發技術。(extends與super,通過繼承可形成類的層次結構)
      • 多態,允許將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。即允許將子類類型的指針賦值給父類類型的指針。(覆蓋與重載)
    • 泛型保證了集合中對象類型的兼容性。是一種參數化類型的機制。它可以使得代碼適用於各種類型,從而編寫更加通用的代碼。泛型是一種編譯時類型確認機制。它提供了編譯期的類型安全,確保在泛型類型(通常為泛型集合)上只能使用正確類型的對象,避免了在運行時出現ClassCastException
    • 錯誤和異常表示的是不正常或不合法的處理。
    • Javadoc可用於創建關於類集的在線HTML文檔。任何程序或類集的文檔都可以使用Javadoc來生成,是為java代碼添加註釋的官方標準。
      • @author標簽用於標識編寫代碼的程序員
      • @version標簽用於指定代碼的版本號
      • @return標簽用於表明由該方法返回的值
      • @param標簽用於標識傳遞給該方法的每個參數
  • 第四章(以鏈表替代棧的作用)

    • 鏈式結構是一種數據結構,使用對象引用變量來創建對象之間的鏈接。
    • 引用變量又稱為指針
    • 單向鏈表雙向鏈表
      • 單向鏈表是鏈表的一種,其特點是鏈表的鏈接方向是單向的,對鏈表的訪問要通過順序讀取從頭部開始。
      • 雙向鏈表是鏈表的一種,其中的每個結點都具有指向該鏈表中下一個結點和上一個結點的引用。
    • 鏈表中存儲的對象通常泛稱為該鏈表的結點。
    • 程序棧(運行時棧)用於跟蹤被調用方法。每次調用一個方法時,就會創建一個表示該調用的調用記錄,並壓入到程序棧中。
    • 調用記錄:一個對象,表示一個方法的調用。
    • 哨兵結點是位於鏈表前端或末尾的結點,起標識符的作用,不表示鏈表中的某個元素。

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

  • 問題1:數組與鏈表替代棧
  • 問題1解決方案:數組和鏈表在一定程度上都可以表示棧的push、pop、peek等方法,但是數組有容量需要確定的長度大小,而鏈表沒有容量限制。數組利用索引能提供對元素的直接訪問,而鏈表必須依次遍歷元素才能到達其中的某個結點。通過課後的編程項目以及網上的查找可以看出兩者有不同的優缺點:

    • 數組
    • 優點:隨機訪問性強(通過索引可以快速定位)、查找速度快
    • 缺點:插入和刪除效率低(插入和刪除需要整體移動數據)、可能浪費內存(因為是連續的,所以每次申請數組之前必須規定數組的大小,如果大小不合理,則可能會浪費內存)、內存空間要求高,必須有足夠的連續內存空間。數組大小固定,不能動態拓展。
    • 鏈表
    • 優點:插入刪除速度快(因為有next指針指向其下一個節點,通過改變指針的指向可以方便的增加刪除元素)、內存利用率高,不會浪費內存(可以使用內存中細小的不連續空間,並且在需要空間的時候才創建空間)、大小沒有固定,拓展很靈活。
    • 缺點:不能隨機查找,每次查找必須從第一個開始遍歷,查找效率低。

    可以看出,鏈表的優點就是數組的缺點。對於替代棧的方法在代碼中遇到的問題中會具體說明。

  • 問題2:單向列表與雙向列表
  • 問題2解決方案:單向鏈表的每個結點有一個next引用指向鏈表的後續結點,雙向鏈表的每個結點存儲著一個next引用和一個previous引用。雙向鏈表的雙向引用可以使兩
    端既為頭又為尾,適用於復雜的集合排列。

  • 問題3:哨兵結點
  • 問題3解決方案:有哨兵結點的對於具體方法的使用可以簡便,但需要額外的一個結點。

    • 帶哨兵節點的鏈表,需要額外的一個節點,但插入和刪除等操作不需要額外的判斷;不帶哨兵節點,在處理鏈表為空時,和其他情況不一樣,需要單獨判斷一次。
    • 帶哨兵節點的鏈表,插入或刪除時,不論操作的位置,表頭都不變,不需要額外的判斷;不帶哨兵節點的鏈表,插入或刪除操作發生在第一個節點時,表頭指針都要變化,需要額外的處理。

代碼學習中的問題和解決過程

  • 問題1:類LinkedSet和ArraySet有哪些相同與不同?
  • 問題1解決方案:LinkedSet和ArraySet都實現了SetADT接口,都代表了棧,提供了使用Stack所需的必要操作。從用戶角度來看,功能上是可以互換的,但是每一個具體方法內部的運行是不同的,ArraySet運用的是數組來實現的,LinkedSet運用的是鏈表來實現的。

  • 問題2:push、pop、peek、isEmpty、toString方法的實現
  • 問題2的解決方案:

    • push:添加一個元素到棧的一端
      • 數組:先判斷數組是否已滿,未滿的情況下可以直接插在下一個可用位置,滿的條件下可以進行擴容,在插入可用位置即可。
      • 鏈表:創建新結點,含有一個引用,指向要放置到棧中的對象。把原鏈表末尾的結點指向新元素,新結點的next引用設置為指向當前棧頂。
    • pop:從棧的前端移出一個元素
      • 數組:在確保棧中至少有一個元素的前提下返回索引值為存入內容的數組空間數 - 1(索引值從0開始)的元素,令其等於null。
      • 鏈表:在確保棧中至少有一個元素的前提下進行循環(通過next == null的條件)找到鏈表尾部元素,在倒數第二個元素的結點上令其next == null即可。
    • peek:返回一個指向棧的前端元素的引用
      • 數組:返回索引值為存入內容的數組空間數 - 1(索引值從0開始)的元素。
      • 鏈表:進行循環(通過next == null的條件)找到鏈表尾部元素進行輸出。
      • peek與pop的區別就是在於對棧頂元素的查看和移除。
    • isEmpty:如果棧為空返回真,否則返回假
      • 數組:判斷索引值為0的位置是否為空,或是判斷棧的元素計數器top變量是否為0。
      • 鏈表:判斷鏈表的頭位置是否為空,或是判斷棧的元素計數器count變量是否為0。
    • toString:
      • 數組:從索引值最大的位置開始不斷縮減索引值並進行輸出。
      • 鏈表:從鏈表的尾部開始往頭部進行不斷輸出。
      • 直接用Stack.toString()就是從棧底往棧頂輸出,而不是從棧頂往棧底輸出,所以我用數組和鏈表替代棧的時候都改為從棧頂到棧底。

  • 問題3:PP3.2與PP3.8
  • 問題3解決方案:最初這兩個編程項目其實很簡單,用個Stack就好了,結果在周五上課之前就編完了。結果老師說用數組來替代棧,還得重新編!。3.2與3.8的要求在剛開始覺得就是一個要求,覺得元素集不就是一個個字符麽?元素集的含義沒搞懂,其實3.2的要求是針對一個字符串的每一個字符的順序,I love you !就應該是! uoy evol I而3.8的要求是針對集合中的每一個元素{one,two,three}就應該是{three,two,one}。3.2用了charAt()方法,3.8StringTokenizer方法。在實現的基礎上我用了上學期的一個示例代碼,加了一個循環。(3.8我覺得元素集之間的間隔符號不一定是空格或是逗號,所以我采用可以使任意一個符號都可以。)
    • 3.2用棧編寫
      技術分享圖片
    • 3.2用數組編寫
      技術分享圖片
    • 3.8用棧編寫
      技術分享圖片
    • 3.8用數組編寫
      技術分享圖片

  • 問題4:PP3.9
  • 問題4解決方案:這個編程項目上學期就做過類似的代碼,只不過運用的是運算式“加減乘除”進行運算的,所以這個不難。但是之前的都是給出長度大小的,而這個是一個一個往裏面添加字符串的,不確定加多少。所以,需要編寫一個方法,在數組容量滿的時候可以進行擴容,上學期有一個示例代碼就是解決這個問題的。算是借鑒了,示例代碼總是在數組們的條件下進行翻倍的擴容,這樣開辟了大量的內存空間,降低效率,所以我在此基礎上進行改寫,在數組容量滿的情況下開辟一個容量空間,每次都會剩下一個空間。在保證數組空間未滿的情況下,有保證了不浪費內存空間。在實現的基礎上我有又使界面變得更加人性,在空棧的情況下添加了一個Toast,進行提醒,又給圖標換了我最喜歡的復仇者聯盟。哈哈~~~~
    • 壓入棧
      技術分享圖片
    • 彈出棧
      技術分享圖片
    • 顯示內容
      技術分享圖片
    • 擴容
      技術分享圖片
    • 結果
      技術分享圖片
      技術分享圖片

  • 問題5:PP4.2
  • 問題5的解決方案:編程項目4.2做的很混亂,開始陷入找postfix程序,在第三章根本沒有這個程序。後來以憑感覺找出來了,但是根據問題題意(可能最近學離散的關系)但是那個PostfixTester和PostfixEvaluator也沒用到ArrayStack,直接就是用棧stack。後來嘗試用鏈表進行改寫,才發現書上有那個push和pop的相關內容。所以很輕松就解決4.2的問題。

代碼托管

技術分享圖片

  • 不小心把上學期的代碼都算上,實質只寫703行代碼(自行計算得出)。

上周考試錯題總結

  • 錯題1:An efficient system handles problems gracefully(一個高效的系統可以完美地處理問題)
    • A.true
    • B.false
  • 錯誤解析:高效的系統是可以充分的利用CPU時間和內存,軟件的質量特征中的健壯性是指可以恰當處理的程度。

  • 新學期第一次考試,又是全英文的考試題,(???︿???)好在題目不是很難,就錯了一道題。而且全過程遇到了幾道不是很確定的題目,盡管對了,但還是不夠清楚。看來前兩章看的不過細致,爭取以後的考試也能像這次的一樣就好。此外,以後也要爭取盡量不用有道來翻譯!

結對與互評

點評(王禹涵)

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

點評(方藝雯)

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

互評對象

  • 本周結對學習情況
    20172314方藝雯
    20172323王禹涵

  • 結對學習內容:數組和鏈表來替代棧

感悟

終於開始編寫項目了,好恐怖!!!還有課堂測試,好在第三章和第四章講述的都是自己熟悉的內容,還有上學期的代碼的加持,還是很順利的度過了。整體來看第三章和第四章的內容,無論是用數組表示棧,還是用鏈表表示棧都是理解數組和鏈表的操作就好。相對比,自己的鏈表還不是像數組一樣應用自如,還是要在鏈表的相關知識點進行理解!!在考試的部分又看到和上學期一樣的不足,需要有道的幫助,本學期還有可怕的四級考試,看來我的英語之路,任重而道遠了。加油,下周又是元氣滿滿的一周(? ??_??)?!

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 0/0 1/1 15/15
第二周 703/703 1/2 20/35

參考資料

  • 面向對象的三個基本特征
  • 單向鏈表與雙向鏈表

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