【資料結構】資料結構總結之線性表、棧和佇列
阿新 • • 發佈:2019-01-25
如果你覺得對你有幫助的話,希望可以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 {
}