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等方法,可是數組有容量須要肯定的長度大小,而鏈表沒有容量限制。數組利用索引能提供對元素的直接訪問,而鏈表必須依次遍歷元素才能到達其中的某個結點。經過課後的編程項目以及網上的查找能夠看出二者有不一樣的優缺點:html
- 數組
- 優勢:隨機訪問性強(經過索引能夠快速定位)、查找速度快
- 缺點:插入和刪除效率低(插入和刪除須要總體移動數據)、可能浪費內存(由於是連續的,因此每次申請數組以前必須規定數組的大小,若是大小不合理,則可能會浪費內存)、內存空間要求高,必須有足夠的連續內存空間。數組大小固定,不能動態拓展。
- 鏈表
- 優勢:插入刪除速度快(由於有next指針指向其下一個節點,經過改變指針的指向能夠方便的增長刪除元素)、內存利用率高,不會浪費內存(可使用內存中細小的不連續空間,而且在須要空間的時候才建立空間)、大小沒有固定,拓展很靈活。
- 缺點:不能隨機查找,每次查找必須從第一個開始遍歷,查找效率低。
能夠看出,鏈表的優勢就是數組的缺點。對於替代棧的方法在代碼中遇到的問題中會具體說明。前端
- 問題2:單向列表與雙向列表
問題2解決方案:單向鏈表的每一個結點有一個next引用指向鏈表的後續結點,雙向鏈表的每一個結點存儲着一個next引用和一個previous引用。雙向鏈表的雙向引用可使兩
端既爲頭又爲尾,適用於複雜的集合排列。java
- 問題3:使用哨兵結點的優勢
問題3解決方案:有哨兵結點的對於具體方法的使用能夠簡便,但須要額外的一個結點。git
- 帶哨兵節點的鏈表,須要額外的一個節點,但插入和刪除等操做不須要額外的判斷;不帶哨兵節點,在處理鏈表爲空時,和其餘狀況不同,須要單獨判斷一次。
- 帶哨兵節點的鏈表,插入或刪除時,不論操做的位置,表頭都不變,不須要額外的判斷;不帶哨兵節點的鏈表,插入或刪除操做發生在第一個節點時,表頭指針都要變化,須要額外的處理。
代碼學習中的問題和解決過程
- 問題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數組擴容問題和使用Android Studiode
- 問題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(一個高效的系統能夠完美地處理問題)
- 錯誤解析:高效的系統是能夠充分的利用CPU時間和內存,軟件的質量特徵中的健壯性是指能夠恰當處理的程度。
新學期第一次考試,又是全英文的考試題,(。•́︿•̀。)好在題目不是很難,就錯了一道題。並且全過程遇到了幾道不是很肯定的題目,儘管對了,但仍是不夠清楚。看來前兩章看的不過細緻,爭取之後的考試也能像此次的同樣就好。此外,之後也要爭取儘可能不用有道來翻譯!
結對與互評
點評(王禹涵)
- 博客中值得學習的或問題:
- 代碼中值得學習的或問題:
- 基於評分標準,我給本博客打分:7分。
- 得分狀況以下:
- 正確使用Markdown語法(加1分)
- 模板中的要素齊全(加1分)
- 教材學習中的問題和解決過程, 一個問題加1分
- 代碼調試中的問題和解決過程, 二個問題加2分
- 感想,體會不假大空的加1分
- 點評認真,能指出博客和代碼中的問題的加1分
點評(方藝雯)
- 博客中值得學習的或問題:
- 圖片運用恰當,很清晰的解釋了問題和相關內容,第三章和第四章總結的特別詳細
- 基於評分標準,我給本博客打分:8分。
- 得分狀況以下:
- 正確使用Markdown語法(加1分)
- 模板中的要素齊全(加1分)
- 教材學習中的問題和解決過程, 二個問題加2分
- 代碼調試中的問題和解決過程, 二個問題加2分
- 感想,體會不假大空的加1分
- 點評認真,能指出博客和代碼中的問題的加1分
互評對象
感悟
終於開始編寫項目了,好恐怖!!!還有課堂測試,好在第三章和第四章講述的都是本身熟悉的內容,還有上學期的代碼的加持,仍是很順利的度過了。總體來看第三章和第四章的內容,不管是用數組表示棧,仍是用鏈表表示棧都是理解數組和鏈表的操做就好。相對比,本身的鏈表還不是像數組同樣應用自如,仍是要在鏈表的相關知識點進行理解!!在考試的部分又看到和上學期同樣的不足,須要有道的幫助,本學期還有可怕的四級考試,看來個人英語之路,任重而道遠了。加油,下週又是元氣滿滿的一週(ง •̀_•́)ง!安全
學習進度條
目標 |
5000行 |
30篇 |
400小時 |
|
第一週 |
0/0 |
1/1 |
15/15 |
|
第二週 |
703/703 |
1/2 |
20/35 |
|
參考資料