• 沒有找到結果。

Data structure

N/A
N/A
Protected

Academic year: 2022

Share "Data structure"

Copied!
59
0
0

加載中.... (立即查看全文)

全文

(1)

Data structure

Lecture by zolution Credit by music960633

2019/03/08

(2)

課程內容 課程內容

• 0. 什麼是資料結構

• 1. stack

• 2. queue

• 3. linked list

(3)

為什麼要學資料結構 為什麼要學資料結構

• 資料結構:如何在電腦中儲存資料

• 對於不同用途選擇不同資料結構

• 時間複雜度

• 空間複雜度

• coding 複雜度

• 資料結構是一種工具

• ( 多種 ) 演算法 +( 多種 ) 資料結構

(4)

為什麼要學資料結構

為什麼要學資料結構

(5)

為什麼要學資料結構 為什麼要學資料結構

• 資料結構:如何在電腦中儲存資料

• 對於不同用途選擇不同資料結構

• 時間複雜度

• 空間複雜度

• coding 複雜度

• 資料結構是一種工具

• ( 多種 ) 演算法 +( 多種 ) 資料結構

(6)

常見的資料結構操作 常見的資料結構操作

• push : 放進一個元素

• pop : 拿出一個元素

• query: 各種查詢

(7)

stack stack

• 堆疊

• 性質

• first in last out (FILO)

• 疊盤子

• 基本操作

• push :把一個元素放進 stack

• pop :把一個元素拿出 stack

(8)

stack stack

• 實做

• 使用陣列或 linked list

• 陣列實做

• 用一個變數 top 記錄頂端的位置

• top=-1: stack 是空的

• push: top 加 1

• pop : top 減 1

(9)

stack stack

stack 操作 結果

top

(10)

stack stack

stack 操作 結果

push 1

top

(11)

stack stack

stack

1 操作 結果

push 1

top

(12)

stack stack

stack

1 操作 結果

push 1 push 2

top

(13)

stack stack

stack

2 1 操作 結果

push 1 push 2

top

(14)

stack stack

stack

2 1 操作 結果

push 1 push 2

pop

top

(15)

stack stack

stack

1 結果

2 操作

push 1 push 2

pop

top

(16)

stack stack

stack

1 結果

2 操作

push 1 push 2

pop push 3

top

(17)

stack stack

stack

3 1 結果

2 操作

push 1 push 2

pop

push 3 top

(18)

stack stack

stack

3 1 結果

2 操作

push 1 push 2

pop push 3

pop

top

(19)

stack stack

stack

1 結果

2 3 操作

push 1 push 2

pop push 3

pop top

(20)

stack stack

stack

1 結果

2 3 操作

push 1 push 2

pop push 3

pop pop

top

(21)

stack stack

stack 結果

2 3 1 操作

push 1 push 2

pop push 3

pop

pop top

(22)

queue queue

• 佇列

• 性質

• first in first out (FIFO)

• 排隊

• 分類:單向、環狀

• 基本操作

• push :把一個元素放進 queue

• pop :把一個元素拿出 queue

(23)

queue queue

• 實做

• 使用陣列或 linked list

• 陣列實做

• 用一個變數 front 記錄最前面的元素的「前一格」位置

• 用一個變數 rear 記錄最後面的元素的位置

• front==rear: queue 是空的

• push: rear 加 1

• pop : front 加 1

(24)

queue queue

queue 操作 結果

front=rear

(25)

queue queue

queue 操作 結果

push 1

front=rear

(26)

queue

queue

queue

1 操作 結果

push 1

rear front

(27)

queue

queue

queue

1 操作 結果

push 1 push 2

rear front

(28)

queue

queue

queue

2 1 操作 結果

push 1 push 2

rear front

(29)

queue

queue

queue

2 1 操作 結果

push 1 push 2

pop

rear front

(30)

queue

queue

queue

2 結果

1 操作

push 1 push 2

pop

rear front

(31)

queue

queue

queue

2 結果

1 操作

push 1 push 2

pop

push 3 rear

front

(32)

queue

queue

queue

3 2 結果

1 操作

push 1 push 2

pop push 3

rear front

(33)

queue

queue

queue

3 2 結果

1 操作

push 1 push 2

pop push 3

pop

rear front

(34)

queue

queue

queue

3 結果

1 2 操作

push 1 push 2

pop push 3

pop

rear front

(35)

queue

queue

queue

3 操作

push 1 push 2

pop push 3

pop pop

結果 1 2

rear front

(36)

queue

queue

queue 結果

1 2 3 操作

push 1 push 2

pop push 3

pop pop

front=rear

(37)

queue queue

• 產生的問題

• 一個元素一旦被 pop ,該位置無法再放新的元素

• 解決方法

• rear 到陣列最後的時候,將所有元素平移到前方

• 使用環狀 queue

• 使用 linked list

(38)

queue queue

front

queue 5

4 操作

...

...

...

push 6

rear

方法一

(39)

queue queue

queue

5 4 操作

...

...

...

push 6 方法一

front rear

(40)

queue queue

queue

6 5 4 操作

...

...

...

push 6 方法一

front rear

(41)

queue queue

front

queue 5

4 操作

...

...

...

push 6

rear

方法二

(42)

queue queue

front

queue 5

4

6 操作

...

...

...

push 6

rear

方法二

(43)

時間複雜度 時間複雜度

push pop

stack O(1) O(1)

queue O(1) O(1)

(44)

Practice Practice

• Try Homework Q36, 37

(45)

linked list linked list

• 鏈結串列

• 基本單元: Node(data + pointer)

• 將很多 Node 接起來

• head 指標指向第一個 Node ,最後一個指標指向 NULL

data data NULL

head data

(46)

linked list linked list

• 性質

• 每個元素只記錄他的下一個元素,外部只記錄起點 (head)

• 動態宣告記憶體

• 分類:單向、雙向、環狀

• 不能隨機存取 (random access)

• 基本操作

• insert: 在兩個元素中插入一個元素,或是在頭尾插入元素

• delete: 刪除一個元素

(47)

linked list linked list

• 實做

• 先定義一個 struct/class Node ,作為 linked list 的節點,裡面存資 訊和一個指向下一個 Node 的指標

• 使用時只用一個變數 head 記錄 linked list 的起點就可以了

(48)

linked list linked list

• 為什麼要這麼麻煩,用陣列不就好了 ( 還能 random access) ?

• 1. 避免記憶體浪費

• dynamic array 也可以做啊 (ex: stl 的 vector)

• 2. 可以快速的插入和刪除節點!

• array 無法做到

(49)

linked list linked list

• insert

data head

data

data NULL

(50)

linked list linked list

• delete

data

head data data NULL

(51)

linked list linked list

• 用 linked list 實做 stack

• 用 linked list 實做 queue

(52)

linked list linked list

• 用 linked list 實做 stack

• push: 在 head 前面插入一個節點

• pop : 刪除 head 指向的節點

• 用 linked list 實做 queue

• 還要多記錄 linked list 的尾端 (end)

• push: 在 end 後面插入一個節點

• pop : 刪除 head 指向的節點

(53)

linked list linked list

• 雙向

• 環狀

data data data

data data

head data

(54)

時間複雜度 時間複雜度

random

access push

front push

back pop

front pop back

Array Yes O(n) O(1) O(n) O(1)

Linked

list No O(1) O(1) O(1) O(1)

(55)

例題思考 1 – 括弧匹配 例題思考 1 – 括弧匹配

• 給一個括弧字串,判斷他是否合法

• ([]){} -> 合法

• {([[]]))} -> 不合法

• What should we do?

(56)

例題思考 1 – 括弧匹配 例題思考 1 – 括弧匹配

• Sol 1: 數數

• 數有幾個左 幾個右就好

• {([)]} ?

(57)

例題思考 1 – 括弧匹配 例題思考 1 – 括弧匹配

• Sol 1: 數數

• 數有幾個左 幾個右就好

• {([)]} ?

(58)

例題思考 1 – 括弧匹配 例題思考 1 – 括弧匹配

• STACK!!!

(59)

例題思考 2 – 長條圖的最大矩形 例題思考 2 – 長條圖的最大矩形

參考文獻

相關文件

從幾何圖形上來看,所有指數函數,在 (0,1) 的切線斜率恰 好為一的函數也只有惟一一個,因此

同一個常數 C ,只適用在 ( 0) 或者 (0, ) 上。.

在撰寫網頁應用程式 HTML 的語法當中,以下何者錯誤?(A)<a>是用來製作超連結的標記(Tag) (B)HREF 是一個在<a>與</a>中指定其他

雙壓力閥在何時才有壓力(訊號)輸出(A) 其中一個輸入口有壓力(訊號)輸出 (B) 經指定的一 個輸入口有壓力(訊號),並且另一個輸入口沒有壓力(訊號) (C)

若我們能知道有 k 個 row 的矩陣一 定能利用 elementary row operations 化為 echelon form 這個事實且利用這個事實證得有 k + 1 個 row 的矩陣一定能利用 elementary row

在前面幾節中要證明一個 integral domain 是一個 unique factorization domain, 我們都去證明這個 integral domain 中的 irreducible elements 和 prime elements 是

Google Science Journal 簡介..

 想要設計一個具有兩個輸入G(gate閘控)和 D(data資料)以及一個輸出Q的閘控閂電 路。當G等於1時,在輸入D出現的二進位資料