data structure lesson05

24
!" แผนการสอนประจําบทเรียน รายชื ่ออาจารยผู จัดทํา สุณี รักษาเกียรติศักดิ์ หัวขอของเนื้อหา ตอนที่ 5.1 ชนิดขอมูลแบบสแตก (2 คาบ) เรื ่องที 5.1.1 การกําหนดคุณลักษณะเฉพาะของสแตก เรื ่องที 5.1.2 การสรางสแตกดวยอะเรย เรื ่องที 5.1.3 การสรางสแตกดวยลิงคลิสต เรื ่องที 5.1.4 การใชสแตก เรื ่องที 5.1.5 การเปรียบเทียบประสิทธิภาพของการสรางสแตกดวยอะเรยและลิงคลิสต ตอนที่ 5.2 การประยุกตใชสแตก (1 คาบ) เรื ่องที 5.2.1 การจัดการหนวยความจํา เรื ่องที 5.2.2 การใชสแตกในกระบวนการเรียกใชโพรซีเจอรหรือฟงชันก เรื ่องที 5.2.3 การตรวจสอบอักขระสมดุล เรื ่องที 5.2.4 การคํานวณคานิพจนเลขคณิต แนวคิด 1. ชนิดขอมูลแบบสแตกมีการประยุกตใชมากในวิทยาการคอมพิวเตอร 2. ชนิดขอมูลแบบสแตกมีโครงสรางขอมูลแบบเชิงเสน (linear) 3. ชนิดขอมูลแบบสแตกมีคุณสมบัติเฉพาะคือ สมาชิกขอมูลที่เขาไปในสแตกทีหลังจะออกกอน (Last In First Out หรือ LIFO) 4. การดําเนินงานกับสแตกไดแก การสรางสแตก (create) การนําสมาชิกลงสแตก (push) การ นําสมาชิกออกจากสแตก (pop) การทดสอบวาสแตกวางหรือไม (empty) การทดสอบวาส แตกเต็มหรือไม (full) การทําใหสแตกเปนสแตกวาง (clear) 5. การที่จะใหผูใชเขาใจคุณสมบัติของสแตกที่ตรงกัน จะตองมีออกแบบคุณสมบัติของสแตก โดยการเขียนคุณลักษณะเฉพาะ (specification) ของสแตกที่เราตองการอยางชัดเจน

Upload: suhatt-jantorn

Post on 06-Mar-2016

215 views

Category:

Documents


0 download

DESCRIPTION

แผนการสอนประจําบทเรียน หัวขอของเนื้อหา รายชื่ออาจารยผูจัดทํา สุณี รักษาเกียรติศักดิ์ เอกสารประกอบการสอน 1. เอกสารชุดวิชา #% ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน #& ตอนที่ 5.1 สแตก โดยรายละเอียดของคุณลักษณะเฉพาะของสแตกจะเปนดังนี้

TRANSCRIPT

Page 1: data structure lesson05

!"

แผนการสอนประจําบทเรียน

รายช่ืออาจารยผูจัดทํา สุณี รักษาเกียรติศักดิ ์

หัวขอของเนื้อหา

ตอนที ่5.1 ชนิดขอมูลแบบสแตก (2 คาบ) เร่ืองท่ี 5.1.1 การกําหนดคุณลักษณะเฉพาะของสแตก เร่ืองท่ี 5.1.2 การสรางสแตกดวยอะเรย เร่ืองท่ี 5.1.3 การสรางสแตกดวยลิงคลิสต เร่ืองท่ี 5.1.4 การใชสแตก เร่ืองท่ี 5.1.5 การเปรียบเทียบประสิทธิภาพของการสรางสแตกดวยอะเรยและลิงคลิสต

ตอนที ่5.2 การประยุกตใชสแตก (1 คาบ) เร่ืองท่ี 5.2.1 การจัดการหนวยความจํา เร่ืองท่ี 5.2.2 การใชสแตกในกระบวนการเรียกใชโพรซีเจอรหรือฟงชันก เร่ืองท่ี 5.2.3 การตรวจสอบอักขระสมดุล เร่ืองท่ี 5.2.4 การคํานวณคานิพจนเลขคณิต

แนวคดิ 1. ชนิดขอมูลแบบสแตกมีการประยุกตใชมากในวิทยาการคอมพิวเตอร 2. ชนิดขอมูลแบบสแตกมีโครงสรางขอมูลแบบเชิงเสน (linear) 3. ชนิดขอมูลแบบสแตกมีคุณสมบัติเฉพาะคือ สมาชิกขอมูลที่เขาไปในสแตกทีหลังจะออกกอน

(Last In First Out หรือ LIFO) 4. การดําเนินงานกับสแตกไดแก การสรางสแตก (create) การนําสมาชิกลงสแตก (push) การนําสมาชิกออกจากสแตก (pop) การทดสอบวาสแตกวางหรือไม (empty) การทดสอบวาสแตกเต็มหรือไม (full) การทําใหสแตกเปนสแตกวาง (clear)

5. การที่จะใหผูใชเขาใจคุณสมบัติของสแตกที่ตรงกัน จะตองมีออกแบบคุณสมบัติของสแตกโดยการเขียนคุณลักษณะเฉพาะ (specification) ของสแตกที่เราตองการอยางชัดเจน

Page 2: data structure lesson05

#$

6. เม่ือมีการเขียนคุณลักษณะเฉพาะท่ีชัดเจนแลว ผูสรางก็สามารถจะสรางสแตกตามท่ีออกแบบไวได โดยรายละเอียดของการสรางจะซอนจากผูใช

7. ในการสรางสแตกผูสรางตองดําเนินการสองส่ิงใหญ ๆ คือ เลือกการแทนที่ขอมูลของสแตก และสรางการดําเนินงานโดยใชการแทนท่ีขอมูลท่ีเลือกแลว

8. ในการสรางสแตกผูสรางสามารถที่จะเลือกใชการแทนที่ขอมูลของสแตกแบบอะเรยหรือลิงคลิสตก็ได

9. ในการใชชนิดขอมูลแบบสแตก ผูใชเพียงแตใชตามคุณลักษณะเฉพาะที่ออกแบบไวเทานั้น ไมตองสนใจวาผูสรางจะเลือกการแทนที่ขอมูลของสแตกอยางไร และสรางมาดวยวิธีการอยางไร

วัตถุประสงค หลังจากศึกษาบทเรียนที่ 5 แลว นักศึกษาสามารถ

1. บอกถึงคุณลักษณะเฉพาะของสแตกได วาสแตกมีสมาชิกเปนอยางไร มีโครงสรางขอมูลอยางไร และสามารถดําเนินงานอะไรกับสแตกไดบาง

2. สรางสแตกโดยใชการแทนที่ขอมูลแบบอะเรยได 3. สรางสแตกโดยใชการแทนที่ขอมูลแบบลิงคลิสตได 4. ใชสแตกหรือทดสอบการใชงานของสแตกได 5. เปรียบเทียบประสิทธิภาพระหวางการสรางสแตกดวยอะเรยและลิงคลิสต ในรูปของฟงชันบิ๊กโอ (function Oh) ได

6. บอกตัวอยางการประยุกตใชสแตกในสาขาวิชาวิทยาการคอมพิวเตอรได

กิจกรรมการเรียนการสอน กิจกรรมท่ีนักศึกษาตองทําสําหรับการเรียนการสอน ไดแก

1. ศึกษาเอกสารชดุวิชา/โฮมเพจชุดวิชา ตอนที่ 5.1 และตอนที ่5.2 2. ทํากิจกรรมของบทเรียนที่ 5 3. ทําแบบประเมินผลของบทเรียนที่ 5

เอกสารประกอบการสอน 1. เอกสารชดุวิชา

สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร

Page 3: data structure lesson05

#%

ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน

Page 4: data structure lesson05

#&

ตอนท่ี 5.1 สแตก

หัวเรื่อง เร่ืองท่ี 5.1.1 การกําหนดคุณลักษณะเฉพาะของสแตก เร่ืองท่ี 5.1.2 การสรางสแตกดวยอะเรย เร่ืองท่ี 5.1.3 การสรางสแตกดวยลิงคลิสต เร่ืองท่ี 5.1.4 การทดสอบการใชสแตก เร่ืองท่ี 5.1.5 การเปรียบเทียบประสิทธิภาพของการสรางสแตกดวยอะเรยและลิงคลิสต

แนวคดิ 1. การกําหนดคุณลักษณะเฉพาะของสแตกมีความสําคัญมากในการส่ือสารระหวางผูสรางสแตกและผูใชสแตก โดยที่ผูใช ใชโดยทราบขอกําหนดจากคุณลักษณะเฉพาะที่กําหนด และผูสรางก็สรางตามคุณลักษณะเฉพาะท่ีกําหนด

2. ผูใชไมตองสนใจในรายละเอียดของการสราง ผูใชเพียงแตทราบวาสแตกมีคุณสมบัติอยางไรและสามารถดําเนินงานอะไรกับสแตกไดบาง ในการดําเนินงานแตละอยางผูใชตองใหขอมูลเขาอยางไร และผูใชจะไดผลลัพธอะไรหลังจากใชการดําเนินงานนั้น ๆ

3. ผูสรางสามารถที่จะสรางสแตกโดยใชการแทนที่ขอมูลแบบอะเรยหรือลิงคลิสตก็ได โดยไมมีผลตอการเรียกใชของผูใช

วัตถุประสงค หลังจากที่ศึกษาตอนที่ 5.1 แลว นักศึกษาสามารถ

1. เขียนคุณลักษณะเฉพาะของชนิดขอมูลแบบสแตก และบอกการดําเนินงานท่ีสําคัญของสแตก 2. สรางสแตกดวยอะเรยได 3. สรางสแตกดวยลิงคลิสตได 4. ทดสอบการใชสแตกเพ่ือตรวจสอบวาสแตกท่ีผูสราง สรางมา สรางไดถูกตอง 5. เปรียบเทียบประสิทธิภาพของการสรางสแตกดวยอะเรยและลิงคลิสตได

เรื่องที่ 5.1.1 การกําหนดคุณลักษณะเฉพาะของสแตก

ในการกําหนดคุณลักษณะเฉพาะของสแตก จะประกอบดวย 3 สวน ใหญ ๆ คือ • การกําหนดวาสมาชิกของสแตกที่ใชมีชนิดขอมูลเปนอะไร • การกําหนดวาสมาชิกของสแตกมีโครงสราง หรือความสัมพันธกันอยางไร • การกําหนดวาเราสามารถดําเนินงานอะไรกับสแตกไดบาง

Page 5: data structure lesson05

#'

โดยรายละเอียดของคุณลักษณะเฉพาะของสแตกจะเปนดังน้ี

คุณลักษณะเฉพาะ 5.1 คุณลักษณะเฉพาะของสแตก สมาชิก: สมาชิกของสแตกจะมีชนิดเปนอยางไรก็ได แตในที่นี้สมมติใหมีชนิดเปน StdElement โครงสราง: สแตกจะมีโครงสรางแบบเชิงเสน และอันดับของการนําสมาชิกเขาและออกจากสแตกมี

ความสําคัญ คือ สมาชิกที่เขาไปอยูในสแตกกอนจะออกจากสแตกหลังสมาชิกที่เขาไปใน สแตกทีหลัง น่ันคือ การเขาทีหลังออกกอน (Last ln First Out หรือ LIFO)

การดําเนินงาน: มีการดําเนินงานทั้งหมด 6 การดําเนินงาน สัญลักษณ : ให S – pre เปน สถานะของสแตกกอนการดําเนินงาน S – post เปน สถานะของสแตกหลังการดําเนินงาน Pre เปนเง่ือนไขเร่ิมตนท่ีตองเปนจริงกอนการดําเนินงาน Post เปนผลลัพธจากการดําเนินงาน Create Pre: ไมมี Post: มีสแตกวางเกิดขึ้น Push ( E : StdElement ) Pre: สแตกยังไมเต็ม (ยังมีที่วาง) Post: สแตกจะมี E เปนสมาชิกลาสุดของสแตก หรือสมาชกิบนสุดของสแตก Pop ( VAR E : StdElement ) Pre: สแตกตองไมวาง Post: E เปนสมาชิกลาสุดของ S – pre และ S – post จะไมมี E เปนสมาชิกอีกตอไป Empty : boolean Pre: ไมมี

Post: ถา สแตกไมมีสมาชิกอยูเลย แลว Empty จะเปนจริง ไมเชนนั้น Empty จะเปนเท็จ Full : boolean Pre: ไมมี Post: ถา สแตกมีสมาชกิเตม็ แลว Full จะเปนจริง ไมเชนนั้น Full จะเปนเท็จ Clear Pre: ไมมี Post: สแตกจะเปนสแตกวาง

Page 6: data structure lesson05

#(

หมายเหตุ ในบทเรียนที่ 3 เราไดกลาวถึงชนิดขอมูล StdElement เปนดังน้ี TYPE StdElement = RECORD

Key : Keytype;

Data : Datatype

END;

ตัวอยาง 5.1 ตัวอยางสมาชิกขอมูลชนิดตาง ๆ ตัวอยางของชนิดขอมูล StdElement เชน Student หรือ Book ซ่ึงมีชนิดเปนดังน้ี

TYPE Student = RECORD Id : integer; {Key part} Name : string[20]; {Data part: Name,Math,Stat,Comp} Math, Stat, Comp : integer END;

TYPE Book = RECORD Call_no : integer; {Key part} Author : string[15]; {Data part: Author, Title, Publisher, Status} Title : string[20]; Publisher : string[15]; Status : char; {I = Checked In, O = Checked Out}; END;

กิจกรรม 5.1 ฝกการเขียนคุณลักษณะเฉพาะของการดําเนินงาน ในคุณลักษณะเฉพาะขางตนของการดําเนินงาน Pop มีเงื่อนไขเริ่มตน (pre) วา สแตกตองไมเปน

สแตกวาง หากเราเอาเง่ือนไขเร่ิมตนน้ีออกไป น้ันคือสแตกจะเปนสแตกวางก็ได ถาสแตกเปนสแตกวาง การดําเนินงานของ Pop ก็ไมสําเร็จ ซ่ึงจะสงผลลัพธออกมาทางพารามิเตอร Fail

จงเขียนคุณลักษณะเฉพาะของการดําเนินงาน Pop ใหมตามขอกําหนดที่กลาวขางตน

เรื่องที่ 5.1.2 การสรางสแตกดวยอะเรย

ในการสรางสแตกดวยอะเรย หมายถึงเราเลือกการแทนที่ขอมูลของสแตกดวยอะเรยซึ่งเปนการจัดสรรเนื้อที่หนวยความจําแบบสแตติก น้ันคือ จะมีการกําหนดขนาดของสแตกลวงหนาวาจะมขีนาดเทาใดและจะมีการจัดสรรเนื้อที่หนวยความจําใหเลย การสรางสแตกน้ีจะสรางในยูนิตชือ่ StackUA ดังน้ี

UNIT StackUA; 1 INTERFACE 2 3 CONST Maxsize = 100 {User supplied}; 4 5 TYPE KeyType = 1..100 {ID}; 6 DataType = RECORD 7 Name : string[20]; 8 Math, Stat, Comp : integer; 9 END; 10 StdElement = RECORD 11

Page 7: data structure lesson05

#)

Key : KeyType; {User supplied} 12 Data : DataType; {User supplied} 13 END; 14 VAR S : ARRAY[1..Maxsize] OF StdElement; 15 Top : 0..Maxsize; 16 17 PROCEDURE Create; 18 PROCEDURE Push(E : StdElement); 19 PROCEDURE Pop(VAR E : StdElement); 20 FUNCTION Empty : boolean; 21 FUNCTION Full : boolean; 22 PROCEDURE Clear; 23 24 IMPLEMENTATION 25 26 PROCEDURE Create; 27 BEGIN 28 Top := 0 29 END; 30 31 PROCEDURE Push(E : StdElement); 32 BEGIN 33 Top := Top + 1; 34 S[Top] := E; 35 END; 36 37 PROCEDURE Pop(VAR E : StdElement); 38 BEGIN 39 41 END; 42 43 FUNCTION Empty : boolean; 44 BEGIN 45 IF Top = 0 THEN Empty := true 46 ELSE Empty := false; 47 END; 48 49 FUNCTION Full : boolean; 50 BEGIN 51 IF Top = Maxsize THEN Full := true 52 ELSE Full := false 53 END; 54 55 PROCEDURE Clear; 56 BEGIN 57 Top := 0 58 END; 59 60

END. 61

โปรแกรม 5.1 การสรางสแตกดวยอะเรย

ขอสังเกต ในการนิยาม VAR ขางตน ตัวแปร S และ Top จะเปนตัวแปรที่บงถึงสแตก

Page 8: data structure lesson05

#*

กิจกรรม 5.2 ทดสอบการสรางชนิดขอมูลสแตกดวยอะเรย จงเขียนโคดของการดําเนินงาน Push ใหสมบูรณ พรอมทดสอบ UNIT StackUA ของโปรแกรม

5.1 โดยใหสมาชิกของสแตกมีชนิดเปน Student และใหชื่อไฟล source code เปน StackUA.pas และจงสังเกตวาเม่ือคอมไพลผานแลวจะเกิด object code ชื่อ StackUA.TPU

Page 9: data structure lesson05

#!

เรื่องที่ 5.1.3 การสรางสแตกดวยลิงคลิสต

ในการสรางสแตกดวยลิงคลิสต หมายถึงเราเลือกการแทนท่ีขอมูลของสแตกดวยลิงคลิสตซ่ึงเปนการจัดสรรเนื้อที่หนวยความจําแบบไดนามิก น้ันคือ หนวยความจําจะถูกจัดสรรเมื่อมีการขอใชจริง ๆ ระหวางการประมวลผลโปรแกรมผานตัวแปรชนิด pointer การสรางสแตกน้ีจะสรางในยูนิตชือ่ StackUL ดังแสดงในโปรแกรม 5.2

Page 10: data structure lesson05

##

UNIT StackUL; 1 INTERFACE 2 CONST Maxsize = 100 { User supplied }; 3 4 TYPE KeyType = 1..100 {ID}; 5 DataType = RECORD 6 Name : string[20]; 7 Math, Stat, Comp : integer; 8 END; 9 StdElement = RECORD 10 Key : Keytype ; 11 Data : Datatype ; 12 END; 13 pointer = ^Node; 14 Node = RECORD 15 El : StdElement; 16 Next : pointer; 17 END; 18 VAR Top : pointer; {Top is stack} 19 PROCEDURE Create; 20 PROCEDURE Push (E : StdElement); 21 PROCEDURE Pop (VAR E : StdElement); 22 FUNCTION Empty : boolean; 23 FUNCTION Full : boolean; 24 PROCEDURE Clear; 25 26 IMPLEMENTATION 27 28 PROCEDURE Create; 29 BEGIN 30 Top := nil; 31 END; 32 PROCEDURE Push(E : StdElement); 33 VAR P : pointer ; 34 BEGIN 35 new(P); 36 P^.El := E; 37 P^.Next := Top; 38 Top := P; 39 END; 40 PROCEDURE Pop(VAR E : StdElement); 41 VAR P : pointer; 42 BEGIN 43 P := Top; 44 E := P^.EL; 45 Top := Top^.Next; 46 dispose(P); 47 END; 48 FUNCTION Empty : boolean ; 49 BEGIN 50 IF Top = NIL THEN Empty := true 51 ELSE Empty := false; 52 END; 53 FUNCTION Full : boolean ; 54 BEGIN 55 Full := false 56 END; 57 PROCEDURE Clear; 58 VAR P : pointer; 59 BEGIN 60 WHILE Top <> NIL DO 61 BEGIN 62 P := Top; 63 Top := Top^.Next; 64 dispose(P); 65 END; 66 END; 67 END. 68

โปรแกรม 5.2 การสรางสแตกดวยลิงคลิสต

Page 11: data structure lesson05

#"

หมายเหตุ 1. ถาเลือกใชการสรางสแตกดวยลิงคลิสต สแตกจะไมมีวันเต็มคราบใดที่ยังมีเนื้อที่ในหนวยความ

จํา (ในฮีป) 2. เราสามารถจะใชการดําเนินงานท่ีมีอยูแลว เชน Empty และ Pop ใน Clear ได ดังน้ี

PROCEDURE Clear;

VAR E : StdElement ;

BEGIN

WHILE NOT Empty DO

Pop(E);

END;

กิจกรรม 5.3 ทดสอบการสรางชนิดขอมูลสแตกดวยอะเรย จงทดสอบ UNIT StackUL ตามตัวอยางที่กลาวขางตน โดยใหสมาชิกของสแตกมีชนิดเปน

Student และใหชื่อไฟล source code เปน StackUL.pas และจงสังเกตวาเมื่อคอมไพลผานแลวจะเกิด object code ชื่อ StackUL.TPU

เรื่องที่ 5.1.4 การใชและการทดสอบสแตก

เม่ือเราสรางสแตกข้ึนมาแลว ไมวาจะเปนการแทนที่ขอมูลสแตกดวยอะเรย (StackUA.TPU) หรือการแทนท่ีขอมูลสแตกดวยลิงคลิสต (StackUL.TPU) ผูใชสามารถจะเรียกใชการดําเนินงานของสแตกไดในรูปแบบเดียวกัน ไมขึ้นกับการแทนที่ขอมูลที่ใช

ตัวอยางการทดสอบการใชงานของสแตกที่มีชนิดขอมูลสมาชิกเปน Book เปนดังน้ี

PROGRAM StackT; 1

USES wincrt, StackUA; 2

VAR Choice : char; 3 Data : Book; 4

PROCEDURE MainMenu; 5

BEGIN 6

writeln(' ----------------------------------------'); 7

writeln(' | MAIN MENU |'); 8

writeln(' ----------------------------------------'); 9

writeln(' | 1. Push data into Stack |'); 10

writeln(' | 2. Pop data out of Stack |'); 11

writeln(' | 3. Test whether Stack is empty |'); 12

writeln(' | 4. Clear Stack |'); 13

writeln(' | 9. Exit |'); 14

writeln(' ----------------------------------------'); 15

END; 16

PROCEDURE GetElement (VAR E : Book); 17

BEGIN 18

Page 12: data structure lesson05

"$

writeln('Please input data '); 19 write('Call_no : '); readln(E.Call_no); 20

write('Author : '); readln(E.Author); 21

write('Title : '); readln(E.Title); 22

write('Publisher : '); readln(E.Publisher); 23

write('Status : '); readln(E.Status); 24

write('Price : '); readln(E.Price); 25

END; 26

PROCEDURE PrintElement (E : Book); 27

BEGIN 28

WITH E DO 29

writeln (Call_no:7, Author:15, Title:20, Publisher:15, 30

Status:9, Price:6); 31

END; 32

BEGIN { Main } 33

clrscr; 34

create; 35

MainMenu; 36

37

writeln; 38

write('Please enter your selection : '); readln(Choice); 39

40

WHILE Choice <> '9' DO 41

BEGIN 42

CASE Choice OF 43

'1' : BEGIN 44

GetElement(Data); 45

Push(Data); 46

writeln ('One element is pushed on top of Stack'); 47

END; 48

'2' : BEGIN 49

Pop(Data, Fail); 50

IF Fail THEN writeln('Stack is empty, cannot pop') 51

ELSE BEGIN 52

writeln ('The top element of the stack 53

before popping is:'); 54

writeln ('Call_no':7, 'Author':15, 55

'Title':20, 'Publisher':15, 56

'Status':9, 'Price':6); 57

PrintElement(Data); 58

END; 59

END; 60

'3' : BEGIN 61

IF Empty THEN writeln('Stack is empty') 62

ELSE writeln('Stack is not empty'); 63

END; 64

'4' : BEGIN 65

Clear; 66

writeln ('Stack is clear'); 67

END; 68

Page 13: data structure lesson05

"%

ELSE MainMenu; 69 70

END {CASE}; 71

writeln; 72

write('Please enter your selection : '); readln(Choice); 73

END {WHILE}; 74

writeln ('$$$ END TESTING GOOD BYE $$$'); 75

readln; 76

END. 77

โปรแกรม 5.3 การทดสอบการใชงานสแตก

กิจกรรม 5.4 ทดสอบการใชงานสแตก

จงทดสอบการใชงานสแตกโดยคอมไพลและรันโปรแกรมขางตน โดยใหชื่อเปน StackT.pas โดยทํา 2 คร้ัง ครั้งแรกเรียกใช USES StackUA และครั้งที่ 2 เรียกใช USES StackUL ซึ่งจะเห็นไดวาผูใชไมตองเปล่ียนแปลงโปรแกรมการเรียกใชเลย ไมวาผูสรางจะสรางสแตกดวยอะเรยหรือลิงคลิสตก็ตาม

เรื่องที่ 5.1.5 เปรียบเทียบประสิทธิภาพของการสรางสแตกดวยอะเรยและลิงคลิสต

ในการเปรียบเทียบประสิทธิภาพของการสรางสแตกดวยอะเรยและลิงคลิสตน้ัน เราจะเปรียบเทียบใน 2 ดาน คือ

1. การเลือกการแทนท่ีขอมูล 2. การสรางการดําเนินงาน

ขอเปรียบเทียบของการเลือกการแทนที่ขอมูลของสแตก

การเลือกการแทนท่ีขอมูลสแตกดวยอะเรย มีขอจํากัดสําหรับขนาดของสแตกและจะตองจองเนื้อที่เทากับขนาดที่ใหญที่สุดของสแตกไวเลย เพราะเปนการจัดสรรเน้ือท่ีในหนวยความจําแบบสแตติก สวนการเลือกการแทนท่ีขอมูลสแตกดวยลิงคลิสต ไมมีขอจํากัดของขนาดของสแตกและหนวยความจําจะถูกใชก็ตอเมื่อมีขอมูลจริงๆ แลวเทาน้ัน เพราะเปนการจัดสรรเนื้อที่หนวยความจําแบบไดนามิก ซึ่งทําใหประหยัดเนื้อที่ในหนวยความจํามากกวา แตการเขียนโคตสําหรับการแทนที่ขอมูลสแตกดวยอะเรยงายกวาการแทนที่ขอมูลดวยลิงคลิสต

ขอเปรียบเทียบของประสิทธิภาพของการดําเนินงาน

ขอเปรียบเทียบของการดําเนินงานท้ัง 6 การดําเนินงานของสแตกท่ีสรางดวยอะเรยและสแตกท่ีสรางดวยลิงคลิสตดังแสดงในตาราง 5.1

Page 14: data structure lesson05

"&

ตาราง 5.1 เปรียบเทียบประสิทธิภาพของการดําเนินงานของสแตกที่สรางดวยอะเรยและลิงคลิสต

การดําเนินงาน สรางดวยอะเรย สรางดวยลิงคลิสต Create O(1) O(1) Push O(1) O(1) Pop O(1) O(1) Full O(1) - Empty O(1) O(1) Clear O(1) O(n)

จะเห็นไดวาทุกการดําเนินงานของสแตกไมวาจะใชอะเรยหรือลิงคลิสตจะใชเวลาคงที่คือ 0(1) ไมข้ึนอยูกับจํานวนของขอมูลในสแตกยกเวนการดําเนินงานของ Clear สําหรับสแตกท่ีสรางดวยลิงคลิสตซ่ึงเวลาที่ใช Clear สแตกขึ้นอยูกับจํานวนขอมูลที่อยูในสแตกคือ 0(n) เมื่อ n คือจํานวนขอมูลที่อยูในสแตก

Page 15: data structure lesson05

"'

ตอนท่ี 5.2 การประยุกตใชสแตก

หัวเรื่อง เร่ืองท่ี 5.2.1 การจัดการหนวยความจํา เร่ืองท่ี 5.2.2 การสรางสแตกในกระบวนการเรียกใชโพรซีเจอรหรือฟงชันก เร่ืองท่ี 5.2.3 การตรวจสอบอักขระสมดุล เร่ืองท่ี 5.2.4 การคํานวณคานิพจนเลขคณิต

แนวคดิ ชนิดขอมูลแบบสแตกมีการประยุกตใชมากในการเขียนโปรแกรมของสาขาวิชาทางวิทยาการ

คอมพวิเตอร เชน การจดัสรรหนวยความจําในการประมวลผลโปรแกรม และการคํานวณคานิพจนเลขคณิต เปนตน

วัตถุประสงค หลังจากที่ศึกษาตอนที่ 5.2 แลว นักศึกษาสามารถ 1. บอกถึงการประยุกตใชชนิดขอมูลแบบสแตกในการโปรแกรมของสาขาวิชาวิทยาการคอมพวิเตอร

เรื่องที่ 5.2.1 การจัดการหนวยความจํา

ในการจดัการหนวยความจําของคอมพวิเตอร โครงสรางขอมูลแบบสแตกคู (double stack) ไดนํามาประยุกตใช หนวยความจําสามารถแทนดวยโครงสรางขอมูลแบบอะเรยดังนี้

CONST M : Number of memory bytes

VAR Ram : ARRAY [0..M-1] OF byte;

โดยทั่วไปการจัดการหนวยความจําจะเปนดังนี้

Reserved By

System

Programs And

procedures

Dynamic variable heap

Local Variable

stack

Operating system

Low Memory ! Available space " High Memory

ลองมาดูตัวอยางของการจัดเก็บคาของตัวแปรในหนวยความจําในตัวอยางโปรแกรม 5.4

Page 16: data structure lesson05

"(

PROGRAM MemAllocation;

VAR P, Q, R : { User defined } ;

PROCEDUDE A;

VAR S : { User defined } ;

BEGIN { A }

2 ---->

3 ----> B ;

6 ---->

END ;

PROCEDURE B;

TYPE pointer = ^Node;

Node = RECORD

El : StdElement ;

Next : pointer ;

END ;

VAR D : pointer ;

X, Y : {User defined};

BEGIN { B }

3 ---->

new(D);

4 ---->

new(D);

new (D);

5 ---->

END;

BEGIN {Main}

1 ---->

2 ----> A;

7 ---->

END.

8 ---->

โปรแกรม 5.4 การประยุกตใชสแตกในการจัดการหนวยความจํา

ภาพของคาของตัวแปรในหนวยความจําเมื่อกําลังประมวลผลโปรแกรม ณ จุดตาง ๆ เปน ดังน้ี คําส่ังแรกของ BEGIN {Main} เนื้อที่หนวยความจําในสแตกจะถูกใชสําหรับตัวแปร P, Q, R

Reserved By

System

Programs And

procedures

P Q R

Operating system

↑ Top of heap ↑ Top of stack 2. เมื่อเรียกใชโพรซีเจอร A ณ คําส่ังแรกของ BEGIN {A}

Page 17: data structure lesson05

")

Reserved By

System

Programs And

procedures

S

P Q R

Operating system

↑ Top of heap ↑ Top of stack 3. เมื่อเรียกใชโพรซีเจอร B ณ คําส่ังแรกของ BEGIN {B}

Reserved By

System

Programs And

procedures

X Y

S

P Q R

Operating system

↑ Top of heap ↑ Top of stack 4. หลังคําส่ัง new (D)

Reserved By

System

Programs And

procedures

D

X Y

S

P Q R

Operating system

↑ Top of heap ↑ Top of stack 5. หลังคําส่ัง new (D)

Reserved By

System

Programs And

procedures

D

D

D

X Y

S

P Q R

Operating system

↑ Top of heap ↑ Top of stack

Page 18: data structure lesson05

"*

6. หลังจากเสร็จส้ินการประมวลผลของโพรซีเจอร B (ตัวแปร X, Y จะถูก Pop ออกจาก สแตก )

Reserved By

System

Programs And

procedures

D

D

D

S

P Q R

Operating system

↑ Top of heap ↑ Top of stack ขอสังเกต ถาเราเรียกใชตัวแปรแบบไดนามิกและเราไมไดทําการ dispose เมื่อไมตองการใชแลว (เชนเราออกจากโพรซีเจอร B แลว ) เนื้อที่ใน heap ก็จะเสียไปไมสามารถนํามาใชไดอีก 7. หลังจากเสร็จส้ินการประมวลผลของโพรซีเจอร A (ตัวแปร S จะถูก pop ออกจากสแตก)

Reserved By

System

Programs And

procedures

D

D

D

P Q R

Operating system

↑ Top of heap ↑ Top of stack 8. หลังจากเสร็จส้ินการประมวลผลของโปรแกรม Main (ตัวแปร P, Q, R จะถูก pop ออกจากสแตก)

Reserved By

System

Programs And

procedures

D

D

D

Operating system

↑ Top of heap ↑ Top of stack

กิจกรรม 5.5 การสรางสแตกคู จงสรางสแตกคูดวยอะเรย โดยใหมีขอกําหนดของสแตกเหมือนเดิม แตพารามิเตอรของการดําเนิน

งานทั้ง 6 จะเปล่ียนไปดังน้ี TYPE StackNo = 1..2; PROCEDURE Create; PROCEDURE Push (E : StdElement; S : StackNo); PROCEDURE Pop (Var E : StdElement; S : StackNo);

Page 19: data structure lesson05

"!

FUNCTION Empty (S : StackNo) : boolean; PROCEDURE Clear (S : StackNo);

เรื่องที่ 5.2.2 การใชสแตกในกระบวนการเรียกใชโพรซีเจอรหรือฟงกชัน (และรีเคอรช่ัน)

จากตัวอยางในเรื่องที่ 5.2.1 กอนหนาน้ีเราจะเห็นสถานะของสแตกในการเรียกใชโพรซีเจอรเปนดังน้ี (M คือ Main, A คือ โพรซีเจอร A, B คือ โพรซีเจอร B)

B

A A A M M M M M

ณ เวลาที่ตําแหนง 1 2 3 6 7 8 ณ เวลาที่ตําแหนง 2 เมือ่มีการเรียกใช A จะมีการ push คาตางๆ ท่ีจําเปนสําหรับ A ซ่ึงเราเรียกวา

activation record ของ A ไดแก ตําแหนงของคําสั่งใน M ที่เรียกใช A เพื่อที่จะกลับไปทําคําสั่งตอไปใน M ไดเมื่อทําคําสั่งใน A เสร็จแลว และคาของตัวแปรใน A เปนตน

ในระหวางที่ประมวลผล A อาจจะมีการเรียกใช B เชน ณ เวลาที่ตําแหนง 3 ก็จะมีการ push activation record ของ B ลงในสแตกซ่ึง activation aecord ของ B ก็จะมีคาตางๆ ที่จําเปน ไดแก ตําแหนงของคําสั่งใน A ที่เรียกใช B และคาของตัวแปรใน B เปนตน

เมือ่เสร็จส้ินการประมวลผลของ A ณ เวลาที่ตําหนง 7 จะมีการ pop ขอมูลของ M (activation record ของ M ) ออกจากสแตกเปนอันเสร็จส้ิน ตัวอยางของ activation record ของโพรซีเจอรหรือฟงกชันแบบรีเคอชัน (recursion)

ลองพิจารณาฟงชันเพ่ือคํานวณคาแฟกตอเรียล (Factorial) ดังน้ี FUNCTION Factorial (N : integer) : integer;

BEGIN

IF N = 0 THEN Factorial := 1

ELSE Factorial := N * Factorial(N - 1)

END;

BEGIN {Main}

P := Factorial (3);

END;

ให F แทน Factorial, M แทน Main สถานะของสแตกในการประมวลผลดังแสดลในภาพประกอบ

5.1

Page 20: data structure lesson05

"#

F(0) F=1 F(1) F(1) F(1) F=1*F(0) F=1*F(0) F=1*F(0) F(2) F(2) F(2) F(2) F(2) F=2*F(1) F=2*F(1) F=2*F(1) F=2*F(1) F=2*F(1) F(3) F(3) F(3) F(3) F(3) F(3) F(3) F=3*F(2) F=3*F(2) F=3*F(2) F=3*F(2) F=3*F(2) F=3*F(2) F=3*F(2) M M M M M M M M M P=F(3) P=F(3) P=F(3) P=F(3) P=F(3) P=F(3) P=F(3) P=F(3) p=6

ภาพประกอบ 5.1 การประยุกตใชสแตกสําหรับรีเคอรชั่น

เรื่องที่ 5.2.3 การตรวจสอบอักขระสมดุล (Balancing Symbol)

ผูที่มีประสบการณในการเขียนโปรแกรมมาแลว จะพบวาสิ่งที่เรามักจะหลงลืมเมื่อเขียนโปรแกรม และทําใหเกิดขอผิดพลาดอยูบอย ๆ คือ การหลงลืมอักขระสมดุล เชน { คูกับ }, [ คูกับ ], ( คูกับ ) เปนตน ซ่ึงในการตรวจสอบอักขระสมดุลน้ัน คอมไพเลอรนําชนิดขอมูลแบบสแตกมาประยุกตใชได โดยมีวิธีการดังนี้

ใหอานอักขระทีละตัว 1. ถา อักขระเปนอักขระเปด เชน {, [, (, เปนตน ให Push ลงสแตก 2. ถา อักขระเปนอักขระปด เชน }, ], ), เปนตน ใหตรวจสอบวาอักขระบน Top ของสแตกเปนอักขระเปดท่ีคูกันหรือไม ถาใช ให Pop อักขระน้ันออกจากสแตก แตถาไมใช แสดงผล error

3. เมือ่อานอักขระหมดแลว แตสแตกไมเปนสแตกวางใหแสดงผล error

เรื่องที่ 5.2.4 การคํานวณคาของนิพจนเลขคณิต (Arithmetic Expression )

โดยทั่วๆ ไปทางคณิตศาสตร เรามักนิยมเขียนนิพจนเลขคณิตในลักษณะที่เรียกวา สัญกรณเติมกลาง (infix notation) คือตัวดําเนินการ (operator) จะอยูตรงกลางของตัวถูกดําเนินการ (operand) ดังรูป operand operator operand

ตัวดําเนินการ ก็คือ เครื่องหมายทางคณิตศาสตร สําหรับการคํานวณตางๆ เรียงตามลําดับการดําเนินการกอน-หลัง (precedence) ไดแก ยกกําลัง ^ คูณ หาร * , / บวก ลบ + , -

Page 21: data structure lesson05

""

ถาเคร่ืองหมายมีลําดับการดําเนินการเดียวกัน จะเลือกดําเนินงานของเครื่องหมายจากซายไปขวา และถามีวงเล็บจะดําเนินงานส่ิงท่ีอยูในวงเล็บกอน

ในการคํานวณนิพจนเลขคณิตดวยคอมพิวเตอร คอมพิวเตอรจะทําการแปลงนิพจนที่เขียนแบบสัญกรณเติมกลาง ใหเปนแบบสัญกรณเติมหลัง (postfix notation) กอน คือ จะอยูในรูปแบบที่ตัวดําเนินการ (operator) อยูหลัง เชน A + B - - - - > AB+ A - B - - - - > AB- A * B - - - - > AB* A / B - - - - > AB/ A ^ B - - - - > AB^

ชนิดขอมูลแบบสแตกไดนํามาใชในการเปลี่ยนนิพจนในรูปแบบของสัญกรณเติมกลาง ใหเปนสัญกรณเติมหลัง และนํามาใชในการหาคาของนิพจนนั้นๆ ดวย ดังรายละเอียดในวิธีการ (algorithm) ดังตอไปน้ี

วิธีการเปลี่ยนนิพจนแบบเติมกลางใหเปนแบบเติมหลัง

1. อานคาตัวอักขระของนิพจน ซ่ึงอักขระน้ีจะเปนไดดังกรณีตอไปน้ี - เปนตัวถูกดําเนินการ (operand), - เปนวงเล็บเปด ”(“, - เปนวงเล็บปด”)”,

2. เปนตัวดําเนินการ (operator) 3. IF ตัวอักขระเปน operand THEN ใหแสดงผลลัพธตัวอักขระนั้น

ELSE ตัวอักขระอาจจะเปนวงเล็บหรือ operator 4. IF สแตกวาง THEN Push ตัวอักขระลงบนสแตก ELSE สแตกไมวาง

IF ตัวอักขระเปน “(“ THEN Push ตัวอักขระลงบนสแตก ELSE ตัวอักขระเปน “)” หรือ operator

5. IF ตัวอักขระ เปน “)” THEN PoP สิ่งที่อยูบนสแตกจนกระทั่งพบ “(“ และ pop ออกมาดวย ELSE ตัวอักขระเปน operator (สิ่งที่อยูบนสแตก “(“ มี priority ตํ่าสุด)

6. IF priority (ตัวอักขระ) > priority (สิ่งที่อยูบนสแตก) THEN Push ตัวอักขระลงบนสแตก ELSE Pop ส่ิงท่ีอยูบนสแตกออกจนกระท่ัง Priority (ตัวอักขระ) > priority (สิ่งที่อยูบนสแตก)

Push ตัวอักขระลงบนสแตก

Page 22: data structure lesson05

%$$

7. กลับไปท่ี 1 และทําจนกระทั่งหมดขอมูล 8. Pop สิ่งที่อยูในสแตกออกมา

หมายเหตุ 1. สิ่งที่อยูในสแตกจะมีเฉพาะเครื่องหมายการกระทํา ( + , - , * , / ,^) และวงเล็บเปด “(“ เทาน้ัน 2. ถาตัวอักขระเปน operand จะเขียน ตัวอักขระน้ันออกมาทันที 3. ถา Pop operator ออกจากสแตกใหเขียน operator น้ันดวย แตถา Pop วงเล็บเปด “(“ ไมตอง

เขียน ถาเราใชวิธีดังกลาวขางตนกับนิพจน ((A+B)*C/D+E^F)/G

จะเปนดังน้ี

ลําดับ

1

2

3

4

5

6

7

8

9

1 0

1 1

1 2

1 3

1 4

1 5

1 6

1 7

1 8

ขอมูล

( ( A + B ) * C / D + E ^ F ) / G

Top สแตก

( ( (

( (

+ ( (

+ ( (

( * (

* (

/ (

/ (

+ (

+ (

^ + (

^ + (

/ /

ผลลัพธ

A B + C * D / E F

^ +

G /

ขั้นตอนการคํานวณคานิพจนแบบสัญกรณเติมหลัง

1. อานคาตัวอักขระของนิพจนจากซายไปขวา 2. IF ตัวอักขระเปน operand THEN Push ตัวอักขระลงบนสแตก

ELSE ตัวอักขระเปน operator Pop สิ่งที่อยูบนสแตก 2 ตัว มาดําเนินการตาม opeartor ของตัวอักขระนั้น ๆ Push ผลลัพธท่ีไดลงบนสแตก

Page 23: data structure lesson05

%$%

3. กลับไปท่ี 1 และทําจนกระทั่งหมดขอมูล 4. Pop ส่ิงท่ีอยูในสแตกออกมาจะเปนผลลัพธ

Page 24: data structure lesson05

%$&

ลําดับ ขอมูล สแตก 1 A A 2 B B A

3 + A+B 4 C C

A+B 5 * (A+B)*C 6 D D

(A+B)*C 7 / ((A+B)*C)/D 8 E E

((A*B)*C)/D 9 F F

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

10 ^ (E^F) ((A+B)*C)/D

11 + (((A+B)*C)/D)+(E^F) 12 G G

(((A+B*C)/D)+(E^F) 13 / ((((A+B)*C)/D)+(E^F))/G