1. 程式人生 > >【資料結構】資料結構總結之線性表、棧和佇列

【資料結構】資料結構總結之線性表、棧和佇列

如果你覺得對你有幫助的話,希望可以star/follow一下喲,我會持續保持更新。

資料結構總結之線性表、棧和佇列

資料結構的課程結束了兩年,當時整理的手寫筆記弄丟了,回頭來看書,發現很多知識點已然生疏,準備寫幾篇博文整理一下。

一、線性表

概念:線性表是由稱為元素(element)的資料項組成的一種有限且有序的序列。線性表分為順序表和連結串列兩種。

(1)順序表的特點

  • 查詢元素:可以通過index訪問任意元素,訪問元素的時間花費為O(1)
  • 新增和刪除元素:如果在有n個元素的表的第i個位置插入元素或者刪除元素,i後面的元素都需要向後或者向前移動位置,時間花費為O(n)
  • 順序表元素儲存的記憶體空間是連續的

(2)連結串列的特點

  • 使用指標實現的線性表稱為連結串列
  • 連結串列的記憶體空間是動態分配
  • 連結串列元素儲存的記憶體空間不是連續的
  • 查詢元素:需要遍歷查詢,時間代價為O(n)
  • 增刪元素:忽略查詢刪除物件的時間,直接對next指標進行操作,時間代價為O(1)
  • 需要header node來解決空連結串列的問題,header node的value為null,next指向連結串列第一個元素。

(3)連結串列的Java實現

public class MyLinkedList {

}

二、棧

概念:只能在一端進行插入和刪除的線性表,先進後出

(1) 順序棧

  • 使用順序表實現,建立時必須宣告棧的size
  • 把n端作為棧頂,pop和push的時間代價為O(1)(千萬別把0端作為棧頂)
  • 空棧的top = -1

(2)鏈式棧

  • 使用連結串列實現,不在需要header node
  • pop和push的時間代價為O(1)

(3)鏈式棧Java實現

public class linkedStack {

}

三、佇列

概念:一種只能從隊尾插入(enqueue),以及從隊首刪除(dequeue)的線性表。先進先出(FIFO)。

(1) 順序佇列

  • 順序佇列實現遇到的問題:如果把所有元素都儲存在陣列的前n個位置,如果選擇把佇列尾部的元素放在位置0,則dequeue操作的時間代價為O(1),enqueue操作的時間代價為O(n)。如果反過來,把佇列尾部的元素放在位置0,dequeue的時間代價為O(n),enqueue操作的時間代價為O(1)。
  • 這個問題的根本原因是在操作時需要移動元素在陣列中的位置,考慮使用迴圈陣列來解決
  • 迴圈陣列遇到的問題,當陣列空和滿時,rear都比front小1(使用計數器解決,記錄當前處於佇列中的元素個數)

(2) 鏈式佇列

  • 連結串列實現,不需要header node

(3) 鏈式佇列Java實現

public class linkedQueue {

}