Stract2.pptx

Download Report

Transcript Stract2.pptx

โครงสร้ างข้ อมูลแบบกองซ้ อน ภาค 2
อาจารย์ พิศิษฐ์ นาคใจ
มหาวิทยาลัยราชภัฏอุตรดิตถ์
การใช้ งานสแตก
แสตกเป็ นโครงสร้ างที่มีประโยชน์มาก ส่วนใหญ่จะใช้ งานกับ
ซอฟแวร์ ระบบ เช่น ช่วยคอมไพล์เลอร์ เกี่ยวกับการจัดการโปรแกรม
ลาดับการเรี ยกฟั งก์ชนั่ การแปลงนิพจน์ทางคณิตศาสตร์
การแปลงนิพจน์ ทางคณิตศาสตร์ ในคอมไพเลอร์ มีความยุง่ ยาก
เกี่ยวกับเรื่ องของ โอเปอร์ เรเตอร์ เรื่ องการลาดับความสาคัญของ
โอเปอร์ เรเตอร์ อีกทังยั
้ งมีเครื่ องหมาย () {} [] ซึง่ ตัว คอมไพเลอร์
จาเป็ นต้ องทาการตรวจสอบ หากขาดข้ างซ้ ายหรื อ ขวาไป คอมไพเลอร์
จะต้ องสามารถบอกได้
การใช้ งานสแตก
อีกทังยั
้ งไม่รวมการ จับคูข่ องลาดับวงเล็บชนิดต่างๆ อีก ซึง่ ปั ญหา
เหล่านี ้ สามารถนา โครงสร้ างข้ อมูลแบบแสตกไปแก้ ปัญหาได้
ตัวอย่างการใช้ งาน
Input (()())
การดาเนินการนิพจน์
ปั ญหาเรื่ องลาดับความสาคัญของโอเปอร์ เรเตอร์ มีปัญหากับ
คอมพิวเตอร์ มาก โดยปรกติคอมพิวเตอร์ มีปัญหากับเรื่ องการ
ประมวลผลนิพจน์ ทางคณิตศาสตร์ อยูแ่ ล้ ว ยังคงต้ องมาคอย
ตรวจสอบ เรื่ องลาดับการคานวณของแต่ละโอเปอร์ เรเตอร์ แทนที่จะได้
ประมวลผลตามโอเปอร์ เรเตอร์ ที่พบก่อน
ลาดับการคานวณ (กระตุ้นสมอง)
เรื่ องลาดับการคานวณในทาง
คอมพิวเตอร์ จะมีการ
จัดลาดับการคานวณก่อนหลัง
โดยมีลาดับดังนี ้
ลำดับ
ควำมสำคัญ
่
เครืองหมำย
1
2
3
4
()
!, ++, --, (type)
*, /, %
+, -
5
6
7
<, <=, >, >=
==, !=
&&
8
||
*=, /=, %=, +=,
-=
9
ตัวอย่างลาดับการคานวน
•
•
•
•
•
(3+4)*5
=
3+4*5
=
(2+7)*4/10
2+7*4/10
10+2*8/4*3-5=
=
=
Infix
การที่เราเขียนตัวโอเปอร์ แลนด์ 2 ตัว และมีตวั โอเปอร์ เรเตอร์ 1 ตัวอยู่
ตรงกลาง เราจะเรี ยกลักษณะการเขียนเช่นนี ้ว่า Infix เช่น A+B,
A*B เป็ นต้ น
ตัวอย่างการใช้ งาน infix
Postfix และ Prefix
สาหรับการเขียนการดาเนินการทางคณิตศาสตร์ มีอีก 2 ตัวนัน่ คือ
Postfix และ Prefix
Postfix คือการนาโอเปอร์ เรเตอร์ ไปไว้ ด้านหลังตัวโอเปอร์ แลนด์ โดย
เวลาคานวณจะเก็บตัวโอเปอร์ แลนด์ไว้ หากมากตัวโอเปอร์ เรเตอร์ เข้ า
มาเมื่อไรก็จะทาการคานวณทันที
Prefix คือ การกระทาตรงข้ ามกับ Postfix คือ การนา
โอเปอร์ เรเตอร์ ไปไว้ ด้านหน้ า เมื่อจะคานวณจะทาการเก็บตัว
โอเปอร์ เรเตอร์ ไว้ ก่อน จากนันหากมี
้
ตวั โอเปอร์ แลนด์ ครบตามต้ องการก็
จะทาการคานวณทันที
ตัวอย่าง PostFix และ Prefix
PostFix
A+B => AB+
A-B => ABA*B => AB*
A/B => AB/
A+B*C = > ABC*+
Prefix
A+B => +AB
A-B => -AB
A*B => *AB
A/B => /AB
A+B*C = >+*CBA
Simulate การคานวณของ Computer
เวลาที่ Computer หรื อ Compiler ทางาน มันจะทางานตังแต่
้
ตัวแรก ไปจนถึงตัวสุดท้ าย จะไม่นิยมให้ Computer หรื อ
Compiler วนกลับมาเพื่อตรวจสอบลาดับอีก ดังนันเราจะมา
้
ทดลองการทางานของComputer กัน
5+6+7*9+3 = ??
5
+
6
+
7
*
9
+
3
5
6
7
9
*
+
3
+
+
+
+
*
7
9
+
5
6
3
ขันตอนการค
้
านวณจากนิพจน์ Postfix
ในการคานวณค่า Postfix ที่แปลงมาแล้ ว ตัว
แปลภาษาจะทาการคานวณโดยใช้ โครงสร้ างสแตกช่วยอีก
เช่นกัน ขันตอนในการค
้
านวณ
1. อ่านข้ อมูลที่เป็ นนิพจน์ Postfix จากซ้ ายไปขวาทีละตัว
2. ถ้ าเป็ น Operand ให้ ทาการ push Operandนัน้
ลงในสแตก แล้ วกลับไปอ่านตัวถัดไป
3. ถ้ าเป็ น Operator ให้ ทาการ pop ค่าจากสแตก 2
ค่า โดยตัวแรกเป็ น Operand ตัวที่ 2 และตัวที่ 1
ตามลาดับ
ขันตอนการค
้
านวณจากนิพจน์ Postfix
5. ทาการคานวณและ ทาการ push ผลลัพธ์ที่ได้ จากการคานวณใน
ข้ อ 4 ลงสแตก
6. ถ้ าข้ อมูลยังอ่านไม่หมดให้ กลับไปทาข้ อ 1 ใหม่
การคานวณ Post Fix
532*+4–5+
5
3
2
*
+
4
-
5
+
การทางานแบบ Post fix ค่อนข้ างง่ายเนื่องจากไม่จาเป็ นต้ องคานึงถึงลาดับ
ของโอเปอร์ เรเตอร์ ดังนันสามารถน
้
ามาประมวลผลตามลาดับได้ เลย
การแปลงนิพจน์จาก Infix เป็ น Post fix
การแปลงจาเป็ นต้ องมี สแตก 1 สแตก ใช้ สาหรับเก็บตัว Operater
และมี array หรื อ linkedlist ไว้ เก็บ Operand และ
Operator ที่ถกู pop ออกมา จากนันท
้ าตามขันตอนดั
้
งนี ้
1. ถ้ าข้ อมูลที่รับเข้ ามาเป็ น Operand ให้ นาไปใส่ไว้ ใน array
หรื อ linkedlist
2. ถ้ าข้ อมูลที่เป็ น Operator เข้ ามาให้ กระทาดังนี ้
1. ถ้ าสแตกว่างให้ push Operator ลงสแตก
2. ถ้ าไม่วา่ งให้ เปรี ยบเทียบ Operator ที่เข้ ามากับ Operator ที่มีอยู่
ในสแตก
1. ถ้ าข้ อมูลที่รับเข้ ามาเป็ น Operand ให้ นาไปใส่ไว้ ใน array หรื อ
linkedlist
2. ถ้ าข้ อมูลที่เป็ น Operator เข้ ามาให้ กระทาดังนี ้
1. ถ้ าสแตกว่างให้ push Operator ลงสแตก
2. ถ้ าสแตกไม่วา่ งให้ เปรี ยบเทียบ Operator ที่เข้ ามาใหม่กบั Operator ในส
แตก
1.
2.
ถ้ า Operator ทีเข้ ามามีลาดับความสาคัญน้ อยกว่าหรื อเท่ากับ Operator ที่มีอยู่ ให้
pop Operator ที่มีอยู่ออกไปไว้ ใน Linked list และเปรี ยบเทียบตัวถัดไป จนกว่าจะ
เจอ Operator ที่มีความสาคัญมากกว่าถึงหยุดและ push ตัวเองลง stack
ถ้ า Operator ทีเข้ ามามีลาดับความสาคัญสูงกว่าให้ push ลง stack
3. ถ้ าข้ อมูลเป็ น ( ให้ push ลง stack
4. ถ้ าข้ อมูลเป็ น ) ให้ pop ออกจาก stack จนกว่าจะเจอวงเล็บเปิ ด ผลจาก
การ pop ให้ เอาไปใส่ไว้ ที่ Linkedlist
5. ถ้ าข้ อมูลที่เข้ ามาหมด ให้ ทาการ Pop ข้ อมูลจาก stack ไปไว้ ที่ Linked
list
ตัวอย่างการแปลงนิพจน์
A+B*C+(D*E+F)*G
ตัวอย่างการแปลงนิพจน์
A+B*C+(D*E+F)*G
ตัวอย่างการแปลงนิพจน์
A+B*C+(D*E+F)*G
ตัวอย่างการแปลงนิพจน์
A+B*C+(D*E+F)*G
กิจกรรม
• กาหนดเสาอยู่ 3 เสา เช่น (A) (B) (C)
• กาหนดห่วงไว้ ที่เสา (A) ซึง่ มีขนาดที่ตา่ งกัน โดยห่วงใหญ่สดุ อยู่
ด้ านล่าง
• และลดหลัน่ กันไป
• ย้ ายห่วงไปอยูเ่ สา (C) โดยย้ ายครัง้ ละ 1 ห่วง
• ไม่สามารถวางจาน ไว้ บนจานที่มีขนาดเล็กกว่าได้
ให้ ทดลองแปลงนิพจน์ จาก Infix เป็ น postfix
และทาการคานวณแบบ Postfix
((8+6)*4) – 2
10+15*20/6
การแปลงนิพจน์จาก Post fix เป็ น infix
• ถ้ าพบโอเปอร์ เรเตอร์ ให้ push ลง stack
• ถ้ าพบโอเปอร์ เรชัน่ ให้ pop ออกมา 2 ตัว (กรณีที่ โอเปอร์ เรชัน่
แบบใช้ 2 โอเปอร์ เรเตอร์ และนา Operator ใส่กลาง
Operand ใส่วงเล็บครอบนิพจน์นนั ้ แล้ ว Push ลง Stack
ตัวอย่าง
AB+CD-*E/
Input
Stack
A
A
B
AB
+
output
A+B
(A+B)
C
(A+B)C
D
(A+B)CD
-
(A+B)
C-D
(A+B)(CD)
*
(A+B)*(CD)
((A+B)*(C
-D))
E
((A+B)*(C
Quiz
1. ลักษณะการเขียนการดาเนินการ “A+B+(C+)” นี ้เรี ยกว่าการ
เขียนแบบPrefix ใช่หรื อไม่
2. คอมพิวเตอร์ สามารถคานวณการเขียนการดาเนินแบบ PostFix
ได้ เพียงอย่างเดียวใช่หรื อไม่
3. การแปลง Infix เป็ น PostFix เป็ นหน้ าที่ของ Compiler
ใช่หรื อไม่
4. การแปลงนิพจน์จาก infix เป็ น postFix จะสิ ้นสุดเมื่อไม่มีข้อมูล
ใหม่เข้ ามา
5. การแปลงนิพจน์การคานวณแบบ PostFix หากพบเครื่ องหมาย
“(” ให้ ทาการ Pop ข้ อมูลออกจนกว่าจะเจอ “)” ใช่หรื อไม่