20172308《Java軟件結構與數據結構》第三週學習總結

教材學習內容總結

第 5 章 隊列

  1. 隊列:
  • 一種線性集合,其元素從一端加入,從另外一端刪除
  • 元素處理:FIFO
  1. 與棧的比較
  • 異:(1) 棧的處理過程只在棧的某一端進行;隊列的處理過程在隊列的兩端進行。(2) 實現不一致
  • 同:與棧相似,隊列中也沒有操做能讓用戶抵達隊列中部,一樣也沒有操做容許用戶重組或刪除多個元素(鏈表能夠知足這類處理)
  1. 隊列中的方法
  • 棧與隊列的實現不一致:Java API提供的stack類實現了棧集合,卻沒有提供隊列類,只提供了Queue接口,由多個類來實現
  • Queue接口提供:
    element方法:檢索隊列首部元素但不刪除它
    add和offer方法:往隊列中添加元素
    poll和remove方法:從隊列中刪除元素
  1. 棧的首要做用是顛倒順序,隊列的首要做用是保持順序html

  2. 鏈表實現隊列
  • 實現關鍵:隊列差異棧在於必須操做鏈表兩端。因此須要指向鏈表首元素的引用和指向鏈表末元素的引用,還有跟蹤隊列元素數目的變量count
  • enqueue操做要求將新元素放到鏈表末端;
  • dequeue操做實現要確保至少存在一個可返回的元素
  1. 數組實現隊列
  • 實現策略:將隊列的某一端固定在數組的索引0處
  • 非環形數組實現的元素位移將產生O(n)的複雜度
    注:對於隊列,用固定數組來實現棧的效率不高。
  • 把數組當作是環形的,能夠除去在隊列的數組實現中把元素位移的須要
  • 環形數組:並非一種新的結構,只是數組的最後一個索引後面跟的是第一個索引,用來存儲隊列。
  1. 雙端隊列:隊列的擴展,容許從隊列的兩端添加、刪除和查看元素。

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

問題1:如何分析理解數組實現的隊列中所需注意的問題?
問題1解析:

首先,數組實現的操做選擇使得效率很低:由於用數組實現隊列的策略是假定隊列的首元素老是存儲在數組的索引0處,而隊列操做會修改集合的兩端,則會要求移動元素,那麼操做的複雜度爲O(n);所以,用固定數組來實現隊列效率不高
因此,爲了除去元素移位的須要,能夠引入環形數組
git

環形隊列:內存上沒有環形的結構,其實是數組的線性空間來實現。
那麼就存在一個問題:當數據達到了數組的尾部怎麼辦?如何判斷達到了尾部?編程

  • 數據達到尾部了能夠進行數組擴容操做以達到要求。
  • 判斷隊列爲空,仍是爲盡是環形隊列的關鍵:當tail追上head時,隊列爲滿時,當head追上tail時,隊列爲空。

【參考資料】環形隊列實現原理windows

問題2:如何理解把數組看做是環形的,能夠除去在隊列的數組實現中把元素位移的須要
問題2解析:每次出隊操做,頭指針後移,每次入隊,尾指針也後移。由於數組是固定長度連續空間,首位指針後移,隊尾可插入區域會愈來愈小。

固然,能夠每次出隊,整個隊列前移,可是數組移動須要犧牲性能。環形隊列能夠解決數組移動的缺點,當尾指針超出數組末尾時,尾指針移動數組頭部。
這就將數組虛擬成了一個環形,只要隊列長度沒達到最大值,就能夠插入,而不用移動數組。數組

【參考資料】
數組實現的 環形隊列工具

代碼運行中的問題及解決過程

問題1:

上週考試錯題總結

  • 錯題1:性能

  • 錯題1解析:這道題很不細心,書上也有的代碼,敲代碼也很不仔細,暴露出來問題,下次必定改正學習

  • 錯題2:測試

  • 錯題2解析:「隨着時間的推移,多態引用能夠引用不一樣類型的對象」,emmm,我知道多態能夠引用不一樣類型的對象,可是這有道翻譯出來的「隨着時間的推移」,我不是很懂,就給了錯.net

  • 錯題3:

  • 錯題3解析:一個引用變量能夠引用任何經過繼承與它相關的類建立的對象

  • 錯題4:

  • 錯題4解析:pop操做能夠經過返回對當前存儲在堆棧頂部的元素的引用和調整對堆棧新頂部的頂部引用來實現

  • 錯題5:

  • 錯題5解析:公共特性不該該位於類層次結構中儘量低的位置,從而最小化維護工做

  • 錯題6:

  • 錯題6解析:堆棧的連接實現從鏈表的前面添加和刪除元素

代碼託管

結對及互評

  • 博客中值得學習的或問題:
    • 侯澤洋同窗的博客排版工整,界面很美觀
    • 問題總結作得很全面
    • 對於書上的疑惑總會想辦法解決它,這種探索的精神值得我去學習
  • 代碼中值得學習的或問題:
    • 對於編程的編寫總能找到角度去解決
  • 本週結對學習狀況
    • 20172302
    • 結對學習內容
      • 第三章內容:集合概述——棧
      • 第四章內容:鏈式結構——棧

補充做業

我認爲對我最重要的五項技能以及如今所處的水平:

  • 保持高標準,不要受制於破窗理論(broken windows theory)
    當你看到不靠譜的設計、糟糕的代碼、過期的文檔和測試用例的時候,不要想 「既然別人的代碼已經這樣了,個人代碼也能夠隨便一點啦。」

如今的水平:若是有明確要求,我能夠作好
想在課程結束後達到的水平:不但主動作, 還會影響同事一塊兒作好

  • 常常給本身充電,身體訓練是運動員生活的一部分,學習是軟件工程師職業的伴侶。每半年就要了解和學習一些新的相關技術。經過按期分享(面對面的分享,寫技術博客等)來確保本身真正掌握了新技術。

如今的水平:看了就忘
想在課程結束後達到的水平:不但主動作, 還會影響同事一塊兒作好

  • 經過快速原型來學習,快速原型的目的是學習,它的價值不在於代碼,而在於你經過快速原型學到了什麼。

如今的水平:歷來沒據說過
想在課程結束後達到的水平: 不但主動作, 還會影響同事一塊兒作好

  • 估計任務所花費的時間,避免意外。在開始工做的時候,要作出時間和潛在影響的估計,並通告相關人士,避免最後關頭意外發生。工做中要告知可能的時間變化,過後要總結

如今的水平:作完了,就知道花費了,不用事先估計
想在課程結束後達到的水平:不但主動作, 還會影響同事一塊兒作好

  • 圖形界面的工具備它的長處,可是不要忘了命令行工具也能夠發揮很高的效率,特別是能夠用腳本構建各類組合命令的時候。

如今的水平:一直用鼠標和GUI
想在課程結束後達到的水平: 不但主動作, 還會影響同事一塊兒作好

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 4/4
第二週 560/560 1/2 6/10
第三週 415/975 1/3 6/16
相關文章
相關標籤/搜索