堆疊鍊錶和佇列1

2021-07-30 21:57:06 字數 2872 閱讀 4078

資料結構:是指相互之間存在一種或多種特定關係的資料元素的集合。聽起來是不是很抽象,簡單理解:資料結構就是描述物件間邏輯關係的學科。比如:佇列就是一種先進先出的邏輯結構,棧是一種先進後出的邏輯結構,家譜是一種樹形的邏輯結構!(初學資料結構的時候很不理解為什麼有「棧」這個東西;佇列很容易理解---無論購物就餐都需要排隊;棧可以認為就是個棧道---只允許乙個人通過的小道,而且只能從一端進入,然後再從這端返回,比如你推了個箱子進去啦,第二個人也推個箱子進去,此時只能等後進來的這個人拉著箱子出去後,你才能退出。)

資料儲存結構:它是計算機的乙個概念,簡單講,就是描述資料在計算機中儲存方式的學科;常用的資料儲存方式就兩種:順序儲存,非順序儲存!順序儲存就是把資料儲存在一塊連續的儲存介質(比如硬碟或記憶體)上----舉個例子:從記憶體中拿出第100個位元組到1000個位元組間的連續位置,儲存資料;陣列就是典型的順序儲存!非順序儲存就是各個資料不一定存在乙個連續的位置上,只要每個資料知道它前面的資料和後面的資料,就能把所有資料連續起來啦;鍊錶就是典型的非順序儲存啦!

陣列、鍊錶、堆疊和佇列是最基本的資料結構,任何程式都會涉及到其中的一種或多種。

陣列是最最基本的資料結構,很多語言都內建支援陣列。陣列是使用一塊連續的記憶體空間儲存資料,儲存的資料的個數在分配記憶體的時候就是確定的:

圖 1.1 包含n

個資料的陣列

訪問陣列中第 

n 個資料的時間花費是 

o(1) 

但是要在陣列中查詢乙個指定的資料則是 

o(n)

。當向陣列中插入或者刪除資料的時候,最好的情況是在陣列的末尾進行操作,時間複雜度是

o(1) 

,但是最壞情況是插入或者刪除第乙個資料,時間複雜度是 

o(n) 

。在陣列的任意位置插入或者刪除資料的時候,後面的資料全部需要移動,移動的資料還是和資料個數有關所以總體的時間複雜度仍然是 

o(n) 

。圖 1.2

向陣列中插入資料

鍊錶是在非連續的記憶體單元中儲存資料,並且通過指標將各個記憶體單元鏈結在一起,最有乙個節點的指標指向 

null 

。鍊錶不需要提前分配固定大小儲存空間,當需要儲存資料的時候分配一塊記憶體並將這塊記憶體插入鍊錶中。

在鍊錶中查詢第 

n 個資料以及查詢指定的資料的時間複雜度是 

o(n) 

,但是插入和刪除資料的時間複雜度是 

o(1) 

,因為只需要調整指標就可以:

圖 2.1

鍊錶圖 2.2

向鍊錶中插入乙個資料

圖 2.3

從鍊錶中刪除乙個資料

向上面這樣的鍊錶結構在插入和刪除的時候程式設計會比較困難,因為需要記住當前節點的前乙個節點,這樣才能完成插入和刪除。為了簡便通常使用帶有頭節點的鍊錶:

圖 2.4

帶有頭節點的單鏈表

上面的鍊錶是單鏈表,此外還有雙鏈表,就是節點中包含指向下乙個節點的指標和指向上乙個節點的指標:

圖2.5

雙向鍊錶

不帶有頭節點的雙向鍊錶在插入和刪除資料的時候也不會出現單鏈表那樣的問題。此外還有一種鍊錶是迴圈鍊錶,它是將雙向鍊錶的頭尾相接:

圖 2.6

雙向迴圈鍊錶

向迴圈雙向鍊錶和迴圈鍊錶中插入或者從中刪除資料只是多移動幾個指標。

堆疊實現了一種後進先出的語義 

(lifo) 

。可以使用陣列或者是鍊錶來實現它:

圖 3.1

堆疊對於堆疊中的資料的所有操作都是在棧的頂部完成的,只可以檢視棧頂部的資料,只能夠向棧的頂部壓入資料,也只能從棧的頂部彈出資料。

佇列實現了先入先出的語義 

(fifo) 

。佇列也可以使用陣列和鍊錶來實現:

圖 4.1 

佇列佇列只允許在隊尾新增資料,在隊頭刪除資料。但是可以檢視隊頭和隊尾的資料。還有一種是雙端佇列,在兩端都可以插入和刪除:

圖 4.2 

雙端佇列

標準庫的棧和佇列時,先包含相關的標頭檔案

#include

stackstk;

棧提供了如下的操作

[cpp]view plain

copy

s.empty()               如果棧為空返回

true

,否則返回

false

s.size()                返回棧中元素的個數    

s.pop()                 刪除棧頂元素但不返回其值    

s.top()                 返回棧頂的元素,但不刪除該元素    

s.push()                在棧頂壓入新元素   

定義佇列如下:

#include

queueq;

佇列提供了下面的操作

[cpp]view plain

copy

q.empty()               如果隊列為空返回

true

,否則返回

false

q.size()                返回佇列中元素的個數    

q.pop()                 刪除佇列首元素但不返回其值    

q.front()               返回隊首元素的值,但不刪除該元素    

q.push()                在隊尾壓入新元素    

q.back()                返回佇列尾元素的值,但不刪除該元素    

使鍊錶分成三種:

單鏈表、迴圈鍊錶、雙向鍊錶

鍊錶通過指標來指向下乙個物件。單鏈表中有乙個關鍵字key和指標next

陣列 鍊錶 堆疊和佇列

資料結構 是指相互之間存在一種或多種特定關係的資料元素的集合。聽起來是不是很抽象,簡單理解 資料結構就是描述物件間邏輯關係的學科。比如 佇列就是一種先進先出的邏輯結構,棧是一種先進後出的邏輯結構,家譜是一種樹形的邏輯結構!初學資料結構的時候很不理解為什麼有 棧 這個東西 佇列很容易理解 無論購物就餐...

陣列鍊錶堆疊和佇列

陣列鍊錶堆疊和佇列 陣列鍊錶堆疊和佇列是最基本的資料結構,任何程式都會涉及到其中的一種或多種。陣列是最最基本的資料結構,很多語言都內建支援陣列。陣列是使用一塊連續的記憶體空間儲存資料,儲存的資料的個數在分配記憶體的時候就是確定的 圖1.1包含n 個資料的陣列 訪問陣列中第 n個資料的時間花費是 o ...

陣列 鍊錶 堆疊和佇列

資料結構 是指相互之間存在一種或多種特定關係的資料元素的集合。聽起來是不是很抽象,簡單理解 資料結構就是描述物件間邏輯關係的學科。比如 佇列就是一種先進先出的邏輯結構,棧是一種先進後出的邏輯結構,家譜是一種樹形的邏輯結構!初學資料結構的時候很不理解為什麼有 棧 這個東西 佇列很容易理解 無論購物就餐...