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

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

教材學習內容總結

本週學習了課本第五章的內容,主要介紹了一種新的線性集合——隊列。講解了關於隊列的相關概念以及使用鏈表和數組實現隊列的方法。html

1、隊列概述

  • 元素處理方式:先進先出(First In First Out,FIFO),第一個進入的元素也將是第一個退出的元素。
    • 隊頭(front或head):取出數據元素的一端。
    • 隊尾(rear或tail):插入數據元素的一端。
  • 隊列的操做
    • enqueue(也稱add或insert):向隊列末端添加一個元素
    • dequeue(也稱remove或serve):從隊列前端刪除一個元素
    • first(也稱front):考察隊列前端的那個元素
    • isEmpty:判斷隊列是否爲空
    • size:判斷隊列中的元素數目
    • toString:返回隊列的字符串表示
  • 應用:存儲重複編碼密鑰、實現售票窗口排隊等
  • 隊列的類型
    • 順序隊列
    • 循環隊列

由於隊列的後四種操做的實現都比較簡單,和以前棧的相關相似操做比較相似。主要的不一樣體如今enqueue和dequeue上,由於棧只需在集合的一端操做,而隊列須要在兩端實現,因此接下來的內容主要在enqueue和dequeue兩種方法上進行討論。前端

2、用鏈表實現隊列

  • 用鏈表進行實現時,要設置兩個引用,一個指向鏈表首元素的引用(head),一個指向鏈表末尾元素的引用(tail)。
  • 對於單向鏈表,通常選擇從末端入列,前端出列。雖然不論從前端仍是後端入列,其複雜度均爲O(1)。但出列時會有很大不一樣,從鏈表前端刪除時複雜度仍爲O(1),但在鏈表末端刪除時,爲了尋找到最末端元素的前一個,必須遍歷鏈表,這樣它的複雜度爲O(n),就不如從前端刪除的速度快了。
  • enqueue操做——將新元素放到鏈表末端
public void enqueue(T element)
    {
        LinearNode<T> node = new LinearNode<T>(element);
        if (isEmpty()) {
            head = node;
        } 
        else {
            tail.setNext(node);
        }
        tail = node;
        count++;
    }
  • dequeue操做——從鏈表前端刪除元素
public T dequeue() throws EmptyCollectionException
    {
        if (isEmpty()) {
            throw new EmptyCollectionException("queue");
        }

        T result = head.getElement();
        head = head.getNext();
        count--;

        if (isEmpty()) {
            tail = null;
        }

        return result;
    }

3、用數組實現隊列

  • 將隊列的某一端固定在數組的索引0處。若是是單向列表,在刪除元素時要移動元素,使得操做的效率很低,因此這種狀況下可使用環形數組來實現隊列。
  • enqueue操做
public void enqueue(T element) {
        if (size() == queue.length) {
            expandCapacity();
        }
        queue[rear] = element;
        rear = (rear + 1) % queue.length;//關鍵代碼:用於正確更新rear的值
        count++;
    }
  • dequeue操做
public T dequeue() throws EmptyCollectionException {
        if (isEmpty()) {
            throw new EmptyCollectionException("queue");
        }
        T result = queue[front];
        queue[rear] = null;
        front = (front + 1) % queue.length;
        count--;
        return result;
    }

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

  • 問題1:書上對於雙端隊列只是簡單地講了一下,它的具體操做有哪些?
  • 問題1解決方案:Deque的含義是「double ended queue」,即雙端隊列。Deque是一種具備隊列和棧的性質的數據結構。雙端隊列中的元素能夠從兩端彈出,其限定插入和刪除操做在表的兩端進行。Deque在Java中以接口的形式存在,同時Deque還繼承Queue(隊列)的接口。
  • Deque的類圖:
  • 經過類圖能夠發現,Deque繼承了Queue(隊列)的接口,它的直接實現有ArrayDeque、LinkedList等。
  • Deque的基本方法
  • 因爲Deque接口繼承Queue接口,Deque也能夠當作隊列使用。
  • 除此以外,Deque也能夠當作棧使用。

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

  • 問題1:在敲課本上的代碼時發現不少標紅,在改過以後仍是不能輸出正確答案。
  • 問題1解決方案:再仔細看了一下發現是代碼中有的變量寫錯了,全部改正部分已在下圖指出。

代碼託管

上週考試錯題總結(正確爲綠色,錯誤爲紅色)

上週沒有課堂測試。java

結對及互評

點評模板:

  • 博客中值得學習的或問題:
    • 優勢:課本單詞部分很棒,從教材和代碼方面的問題能看出來本週對學習內容有很深刻的思考和理解。
    • 問題:圖片排版仍需改善。
  • 代碼中值得學習的或問題:
    • 優勢:問題解決比較詳細。
    • 問題:commit的問題仍是沒有改進。

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20172322
    • 結對學習內容
      • 主要討論了Deque的實現和PP5.7的作法

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

  • 沒想到書上的代碼也會有錯,因此說敲代碼的時候也不能不用腦子地機械敲擊,這樣很容易產生錯誤。
  • 補充做業
    • 在你一輩子中身體最健康、最旺盛的時候,能在大學學習和研究,是一輩子中少有的機會。請說明一下,你以及具有的專業知識、技能、能力上還差距哪些?請看這個技能調查表,從表中抽取5-7項你認爲對你特別重要的技能,記下你目前的水平,和你想在課程結束後達到的水平(必須列出5項)。連接:http://www.cnblogs.com/xinz/p/3852177.html
    • 我所認爲的對我特別重要的技能:
    • Programming:Comprehension(程序理解)(如何理解已有的程序,經過閱讀,分析,DeBug)
      • 課前評估:4 —— 課後評估:9
    • Programming:Design(架構設計,模塊化設計,接口設計)
      • 課前評估:3 —— 課後評估:8
    • Programming:Code Review/Code Quality(代碼複審/代碼規範/代碼質量)
      • 課前評估:3 —— 課後評估:9
    • Programming:Command Line and files(處理命令行參數和文件系統)
      • 課前評估:Command Line 3 files 2 —— 課後評估:9
    • Programming:Big Data(處理大數據)
      • 課前評估:1 —— 課後評估:7
    • Development on Different PlateForms
      • 課前評估:3 —— 課後評估:71
    • 其實其中有不少內容(好比後面幾條)我都是處於0的是徹底不瞭解的,但正是由於不瞭解,因此我不敢輕易下定義它對我是否重要和我應該學到哪一種程度。只能說明我前面還有很長的路要走,Fighting!!

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 10/10 1/1 10/10
第二週 246/366 2/3 20/30
第三週 567/903 1/4 10/40
  • 計劃學習時間:10小時
  • 實際學習時間:10小時
  • 改進狀況:感受本週的東西相對比較容易,和上週也有許多相似,因此學起來沒有上週那麼困難了。

參考資料

相關文章
相關標籤/搜索