สแต็ก (Stacks) · 2011. 11. 1. · ฟังก์ชัน Push (1)...

Post on 22-Sep-2020

1 views 0 download

Transcript of สแต็ก (Stacks) · 2011. 11. 1. · ฟังก์ชัน Push (1)...

สแตก (Stacks)

1 โครงสรางขอมล

โครงสรางขอมลแบบสแตก สแตก (Stacks) เปนลสตแบบเชงเสน (Linear Lists)

โครงสรางขอมลทจดเกบขอมลแบบเรยงล าดบตอเนอง

การเพมขอมลลงในสแตก หรอการน าขอมลออกจากสแตก จะกระท าทจดปลายดานใดดานหนง (เขาออกไดทางเดยว) เรยกวา Top ของสแตก

สแตกเปนโครงสรางขอมลแบบมาทหลงแตออกกอน LIFO (Last In-First Out)

โครงสรางขอมล 2

การด าเนนงานพนฐานของสแตก (Basic Stack Operations) การด าเนนงานเกยวกบโครงสรางขอมลแบบสแตก ประกอบดวยฟงกชนดวยกน

ฟงกชน Push

ฟงกชน Pop

ฟงกชน Stack Top

โครงสรางขอมล 3

ฟงกชน Push (1) การเพมขอมลลงในสแตก จะใชฟงกชน Push

ท าหนาทเพมรายการทต าแหนงบนสดของสแตก

รายการทเพมต าแหนงเขาไปหลงสดจะอยต าแหนงบนสดของสแตก

ปญหาของการ Push กคอ ตองมความมนใจวาภายในสแตกนนมพนทวางพอทจะบรรจขอมลลงไปได

สแตกเตมหรอพนทวางไมเพยงพอ ท าใหเกดสถานะโอเวอรโฟลว (Overflow State) ท าใหไมสามารถใสขอมลใหมเขาไปในสแตกได

โครงสรางขอมล 4

ฟงกชน Push (2)

โครงสรางขอมล 5

การ Push ขอมลลงในสแตก

Push

Top

Top

Data

Stack Stack

Operation

ฟงกชน Pop (1) ฟงกชน Pop เปนฟงกชนคนคาขอมลทอยบนสดของสแตกสงคนใหกบผใช

พรอมทงลบขอมลรายการนนออกไป

สงผลใหขอมลรายการถดไปมาอยในสถานะบนสดอกครง

เมอรายการสดทายในสแตกไดถกน าออกไปหมด สแตกจะอยในสถานะวาง (Empty State)

หากเรยกใชฟงกชน Pop บนสแตกทวางเปลา จะท าใหเกดสถานะอนเดอรโฟลว (Underflow State)

เมอตองการ Pop ขอมลออกจากสแตก จงจ าเปนตองตรวจสอบกอนวาสแตกนนวางหรอไม

โครงสรางขอมล 6

ฟงกชน Pop (2)

โครงสรางขอมล 7

การ Pop ขอมลออกจากสแตก

Pop Top

Top

Data

Stack Stack

Operation

ฟงกชน Stack Top (1) ฟงกชนนจะมความคลายคลงกบฟงกชน Pop ทคนคาขอมลดวยการคดลอก

ขอมลบนสดของสแตกสงคนใหกบผใช

แตกตางกนท ฟงกชน Stack Top จะคนคาขอมลไปยงผใชงานเทานน โดยไมมการลบขอมลออกจากสแตก

หนาทของฟงกชน Stack Top กคอการอานขอมลบนสแตกทอยล าดบบนสด

ดวยการอานขอมลจากสแตกทอยในล าดบบนสดสงคนกลบไปยงผใชงานตอไป

โครงสรางขอมล 8

ฟงกชน Stack Top (2)

โครงสรางขอมล 9

การอานขอมลดวย Stack Top

Stack Top Top Top

Data

Stack Stack

Operation

ตวอยางฟงกชนด าเนนงานพนฐานของสแตก (1)

โครงสรางขอมล 10

Step 1

green

Push

Top

Stack Stack

Operation

green

ตวอยางฟงกชนด าเนนงานพนฐานของสแตก (2)

โครงสรางขอมล 11

Step 2

blue

Push

Top

Stack Stack

Operation

green green

blue Top

ตวอยางฟงกชนด าเนนงานพนฐานของสแตก (3)

โครงสรางขอมล 12

Step 3

blue

Pop

Top

Stack Stack

Operation

green green

Top blue

ตวอยางฟงกชนด าเนนงานพนฐานของสแตก (4)

โครงสรางขอมล 13

Step 4

red

Push

Top

Stack Stack

Operation

green green

red Top

ตวอยางฟงกชนด าเนนงานพนฐานของสแตก (5)

โครงสรางขอมล 14

Step 5

red

Stack Top

Top

Stack Stack

Operation

green green

red red Top

ตวอยางฟงกชนด าเนนงานพนฐานของสแตก (6)

โครงสรางขอมล 15

Step 6

red

Pop

Top

Stack Stack

Operation

green green

red Top

ตวอยางฟงกชนด าเนนงานพนฐานของสแตก (7)

โครงสรางขอมล 16

Step 7

green

Pop

Stack Stack

Operation

green Top

การสรางสแตก (Stack Implementtation) สแตกเปนโครงสรางขอมลทภาษาคอมพวเตอรไมไดมมาใหเหมอนกบอารเรย

สามารถสรางสแตกดวยการแทนทขอมลสแตกได 2 วธ คอ

การสรางสแตกดวยอารเรย

การสรางสแตกดวยลงกลสต

โครงสรางขอมล 17

การสรางสแตกดวยอารเรย (1) เปนการจดสรรพนทหนวยความจ าแบบสเตตก (Static) ซงตองมการก าหนดขนาดของ

สแตกเพอใชงานไวลวงหนาวาตองการขนาดเทาไหร

กท าการจดสรรเนอทภายในหนวยความจ าแบบคงทตายตว

โครงสรางอารเรยทน ามาแทนทขอมลของสแตกจงตอง.... จดเกบเปนขอมลชนดเดยวกน

โครงสรางขอมล 18

หลกการของสแตก

Top

2 3 5 StackAry Count StackMax StackAry

[0] [1] [2] [3] [4] การแทนสแตกดวยอารเรยในเชงกายภาพ

การสรางสแตกดวยอารเรย (2) ขอเสยการสรางสแตกดวยอารเรย

ตองมการจดสรรพนทหนวยความจ าทแนนอนไวลวงหนา

กรณทมการเพมขอมลลงในสแตกมากเกนกวาทก าหนดไวกจะสงผลใหสแตกเตม แตกสามารถแกไขปญหาไดดวยการจดสรรเนอทภายในหนวยความจ าจ านวนมากๆ แตกจะท าใหทวความสนเปลองยงขน

กรณทมขอมลจ านวนนอยหรอไมมขอมลในสแตกเลย หมายความวาตองเสยพนทหนวยความจ าไปเลย

โครงสรางขอมล 19

การสรางสแตกดวยลงกลสต (1) ลงกลสตจะจดสรรหนวยความจ าแบบไดนามก (Dynamic)

หนวยความจ าจะถกจดสรรเมอมการใชงานจรงเทานน

สามารถเกบขอมลตางชนดกนได

การสรางสแตกดวยลงกลสต สแตกจะไมมวนเตมตอเมอยงมเนอทเพยงพอตอการจดสรรไดอย

สวนประกอบส าคญของลงกลสต - - > โครงสรางสองสวนทมความแตกตางกน คอ สวนหว (Head) และสวนขอมล (Data Node)

โครงสรางขอมล 20

การสรางสแตกดวยลงกลสต (2)

โครงสรางขอมล 21

หลกการของสแตก

Top

5

Head

count top

การแทนสแตกดวยลงกลสตในเชงกายภาพ

Data Nodes

สวนหวของสแตก (Stack Head) สวนหวของสแตกจะประกอบดวย 2 แอตตรบวตดวยกนคอ

พอยนเตอร (Top Pointer) ทชไปยงโหนดบนสด

ตวนบ (Count) แสดงจ านวนสมาชกในสแตก

โครงสรางขอมล 22

count top

stack count <integer> top <node pointer> end stack

สวนขอมลของ(Stack data Node) สวนของขอมลจะประกอบดวย

ขอมล

พอยนเตอรทใชส าหรบเชอมโยงไปยงสวนขอมลตวถดไป

โครงสรางขอมล 23

data link

node data <dataType> link <node pointer> end node

การประยกตใชงานสแตก (Stack Application) (1) การเรยงล าดบขอมลแบบยอนกลบ (Revering Data)

คอการจดเรยงล าดบขอมลใหม

โครงสรางขอมล 24

4 3 2 1

1 2

3 4

Stack 1

Stack 2

Pop

การประยกตใชงานสแตก (Stack Application) (2) การแตกขอมลออกเปนสวนๆ (Parsing)

เปนการแตกขอมลออกเปนสวนๆ ใหเปนอสระตอกน เพอสงไปประมวลผล

การแตกขอมลออกเปนสวนยงสามารถน าไปใชกบการตรวจสอบการจบคของเครองหมายวงเลบในนพจนคณตศาสตร

โครงสรางขอมล 25

((A + B) / C

?

(A + B) / C)

?

Opening parenthesis not matched Closing parenthesis not matched

การประยกตใชงานสแตก (Stack Application) (3) การยอนรอย (Backtracking Steps)

เปนการยอนรอยเพอไปสถานะกอนหนา รวมถงการคนหาเสนทางการเดนเพอไปยงเปาหมายปลายทาง (Goal Seeking)

โครงสรางขอมล 26

18

Start node

1 2 3

4 5

6 7

8

9 10 11

12 13 14 15 16

17

The goal

การประยกตใชงานสแตก (Stack Application) (4) การหนวงเวลา (Postponement)

เปนการหนวงเวลาของขอมลไวชวขณะหนง เพอรอการประมวลผลในชวงเวลาทเหมาะสม

น าไปใชกบการแปลงนพจน Infix มาเปน Postpix

โครงสรางขอมล 27

A + X1 * 2

Operator

Operand

Operator คอ เครองหมายการค านวณตางๆ - > + - * /

Operand เปนตวถกด าเนนการ -> เปนตวแปรหรอคาคงท

การประยกตใชงานสแตก (Stack Application) (5) นพจนทางคณตศาสตรสามารถน าเสนอใหแตกตางกนได 3 รปแบบ

นพจน Infix - > นพจนโดยทวไปมกใชกบการค านวณสตรตวเลขตางๆ โดยโอเปอเรเตอรจะอยระหวางตวโอเปอแรนด

นพจน Postfix - > นพจนในรปแบบทโอเปอเรเตอรจะอยขางหลงตวโอเปอแรนด

นพจน Prefix - > นพจนในรปแบบทโอเปอเรเตอรจะอยขางหนาตวโอเปอแรนด

โครงสรางขอมล 28

Prefix : +AB Infix : A+B Postfix : AB+

การแปลงนพจน Infix มาเปน Postfix ดวยมอ (Manual Transformation) (1) กฎเกณฑการแปลงนพจน Infix มาเปน Postfix ดวยมอ ดงขนตอนตอไปน

1. ใหใสเครองหมายวงเลบใหกบทกๆ นพจน ดวยการค านงถงล าดบการค านวณ (คณและหารตองมากอนเครองหมายบวกและลบ)

2. ท าการเปลยนสญลกษณ Infix ในแตละวงเลบใหมาเปนสญลกษณแบบ Posfix โดยใหเรมตนจากนพจนทอยวงเลบในสดกอน จากนนกด าเนนการแปลงใหเปนนพจน Postfix ดวยการยายโอเปอเรเตอรตรงต าแหนงวงเลบนนไปยงต าแหนงวงเลบปดของคนนๆ

3. ถอดเครองหมายวงเลบทงออกไปใหหมด

โครงสรางขอมล 29

การแปลงนพจน Infix มาเปน Postfix ดวยมอ (Manual Transformation) (2) Ex จงแปลงนพจน A + B * C มาเปนนพจน Postfix ดวยมอ

โครงสรางขอมล 30

นพจน Infix ทใหมา A + B * C

ข นตอนท 1 ใสวงเลบใหท งหมดตามล าดบความส าคญ

(A + (B * C))

ข นตอนท 2 พจารณานพจนทอยในวงเลบในสด โดยใหยายเครองหมาย *

ไปไวขางหลง C

(A + (B C *))

จากนนใหยายโอเปอเรเตอร + ซงอยทต าแหนงวงเลบเปดภายนอก

ไปยงต าแหนงวงเลบปดภายนอกของคตวเอง

(A(B C*) + )

ข นตอนท 3 ถอดเครองหมายวงเลบทงออกใหหมด

A B C * +

การแปลงนพจน Infix มาเปน Postfix ดวยมอ (Manual Transformation) (3) Ex จงแปลงนพจน 5 * 6 - 10 มาเปนนพจน Postfix ดวยมอ

โครงสรางขอมล 31

5 * 6 – 10 = ((5 * 6) - 10)

= ((5 6 *) - 10)

= ((5 6 *) 10 -)

= 5 6 * 10 -

การแปลงนพจน Infix มาเปน Postfix ดวยมอ (Manual Transformation) (4) การค านวณหาผลลพธนพจน Postfix ในสแตก

โครงสรางขอมล 32

การแปลงนพจน Infix มาเปน Postfix ดวยมอ (Manual Transformation) (5) การค านวณหาผลลพธนพจน Postfix ในสแตก

โครงสรางขอมล 33

อลกอรทมส าหรบแปลงนพจน Infix มาเปนนพจน Postfix (Algorithmic Transformation) (1)

อลกอรทมการแปลงนพจน Infix มาเปน Postfix

1. ถาขอมลเขาเปนโอเปอแรนด ใหเอาตพตไป Postfix

2. ถาขอมลเขาเปนโอเปอเรเตอร ถาสแตกวาง ให Push ลงในสแตก ถาภายในสแตกมขอมลอย ใหท าการเปรยบเทยบดงน ถาโอเปอเรเตอรทเขามามความส าคญนอยกวา หรอเทยบเทากบโอเปอเรเตอรทอย

สวนบนของสแตกใหด าเนนการ Pop สแตกออกไปท Postfix โดยท าการเปรยบเทยบกบโอเปอเรเตอรทมอยในสแตกไปเรอยๆ จนกระทงโอเปอเรเตอรทอนพตมามล าดบความส าคญมากกวาโอเปอเรเตอรในสแตก จากนนให Push โอเปอเรเตอรทอนพตเขามาลงในสแตก

ถาโอเปอเรเตอรทอนพตเขามามล าดบความส าคญมากกวาโอเปอเรเตอรทอยสวนบนของสแตกให Push โอเปอเรเตอรนนลงในสแตก

โครงสรางขอมล 34

อลกอรทมส าหรบแปลงนพจน Infix มาเปนนพจน Postfix (Algorithmic Transformation) (2)

อลกอรทมการแปลงนพจน Infix มาเปน Postfix

3. ถาขอมลเขาเปนเครองหมายวงเลบ ใหด าเนนการ Push ลงในสแตก

4. ถาขอมลเขาเปนเครองหมายวงเลบปด ใหด าเนนการ Pop สแตกไปยง Postfix จนกระทงพบเครองหมายวงเลบเปด จากนนใหน าเครองหมายวงเลบทงสองทงไป

5. หากด าเนนการจนเสรจสนแลวยงคงมขอมลอยในสแตก ใหด าเนนการ Pop สแตกทเหลออยท งหมดไปท Postfix

โครงสรางขอมล 35

โครงสรางขอมล 36

A A

Infix Stack Postfix

(a)

+ A (b) + B A B (c)

* A B (d)

C A B C (e)

- A B C * + (f)

D A B C * + D (g)

/ A B C * + D (h)

E A B C * + D E (i)

A B C * + D E / - (j)

+

+ *

+ *

-

-

- /

- /

อลกอรทมส าหรบแปลงนพจน Infix มาเปนนพจน Postfix (Algorithmic Transformation) (4)

โครงสรางขอมล 37

ล าดบความส าคญ (Priority) โอเปอเรเตอร

2 1 0

* / + - (

อลกอรทมส าหรบแปลงนพจน Infix มาเปนนพจน Postfix (Algorithmic Transformation) (4) Ex จงแปลงนพจน A * B – (C + D) + E ใหเปนนพจน Postfix

โครงสรางขอมล 38

Input (Infix) Operator Stack Output String (Postfix)

A A

* * A

B * A B

- - A B *

( - ( A B *

C - ( A B * C

+ - ( + A B * C

D - ( + A B * C D

) - A B * C D +

+ + A B * C D + -

E + A B * C D + - E

A B * C D + - E +

การหาผลลพธจากนพจน Postfix (Evaluating Postfix Expressions) ก าหนดให A B C + *

โดยท A = 2 B = 4 C = 6

โครงสรางขอมล 39

2 4 6 + *

Postfix Stack

(a)

4 6 + * (b) 2

6 + * (c)

+ * (d)

* (e)

(f)

2

2

4

4 6

10 2

20

4+6=10

2*10=20

อางอง โอภาส เอยมสรวงศ

โครงสรางขอมล (Data Structures) เพอการออกแบบโปรแกรมคอมพวเตอร.—กรงเทพฯ : ซเอดยเคชน, 2549.

โครงสรางขอมล บทท 7 กราฟ 40