1. 程式人生 > >20172308《Java軟件結構與數據結構》第三周學習總結

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

分享圖片 結構 src log 第三章 刪除 數據 探索 目的

教材學習內容總結

第 5 章 隊列

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

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

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

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

技術分享圖片

首先,數組實現的操作選擇使得效率很低:因為用數組實現隊列的策略是假定隊列的首元素總是存儲在數組的索引0處,而隊列操作會修改集合的兩端,則會要求移動元素,那麽操作的復雜度為O(n);因此,用固定數組來實現隊列效率不高
所以,為了除去元素移位的需要,可以引入環形數組
技術分享圖片

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

  • 數據達到尾部了可以進行數組擴容操作以達到要求。
  • 判斷隊列為空,還是為滿是環形隊列的關鍵:當tail追上head時,隊列為滿時,當head追上tail時,隊列為空。

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

問題2:
問題2解析:

【參考資料】

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

問題1:

上周考試錯題總結

  • 錯題1:

  • 錯題1解析:

  • 錯題2:

  • 錯題2解析:

  • 錯題3:

  • 錯題3解析:

  • 錯題4:

  • 錯題4解析:

代碼托管

結對及互評

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

學習進度條

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

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