สแต็ก (stacks) · 2011. 11. 1. · ฟังก์ชัน push (1)...
Post on 22-Sep-2020
2 Views
Preview:
TRANSCRIPT
สแตก (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
top related