งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

Stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์ เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการ สื่อสาร Website : ict.up.ac.th/yeunyong.

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "Stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์ เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการ สื่อสาร Website : ict.up.ac.th/yeunyong."— ใบสำเนางานนำเสนอ:

1 stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์ เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการ สื่อสาร Website : ict.up.ac.th/yeunyong

2 หัวข้อวันนี้ Application of stack การใช้สแตกช่วยในการ compile program การใช้สแตกช่วยแปลงนิพจน์ คณิตศาสตร์ การใช้สแตกช่วยประมวลผลนิพจน์ postfix การใช้สแตกช่วยในการเรียกใช้ฟังก์ชัน 2

3 Application of stack สแตกเป็นโครงสร้างข้อมูลที่มีประโยชน์ ส่วนใหญ่จะอยู่ในซอฟแวร์ระบบ (System software) ใช้ใน compiler การเรียกใช้ function, recursive การแปลงนิพจน์ และการคำนวณนิพจน์ ฯลฯ ผู้ใช้ทั่วไปอาจไม่ทราบ เพราะถูกซ่อนเอาไว้ 3

4 สแตกช่วยจัดการด้าน โปรแกรมมิ่งอย่างไร ? สิ่งหนึ่งที่สำคัญในการคอมไพล์โปรแกรม คือ การตรวจเช็คในเรื่องของเครื่องหมายวงเล็บ ( ) [ ] { } ถ้าขาดสัญลักษณ์ข้างซ้ายหรือขวาไป -> โปรแกรมนั้นมี syntax error { ( ) [ ( ) ] { } [ { } [ ] ] [ ] ( [ ] ) [ ] ( { } [ { ( ) ] } [ ] ) สามารถใช้ stack ช่วยในการตรวจสอบได้ 4  

5 เมื่ออ่านเจอวงเล็บเปิด ให้ push ลงสแตก เมื่ออ่านเจอวงเล็บปิด ให้ตรวจสอบ top of stack ว่ามีวงเล็บเปิดชนิดเดียวกันหรือไม่ ถ้ามี ให้ pop ออกมา แต่ถ้าไม่มี ให้แสดง error เมื่ออ่านหมดแล้วถ้ามีวงเล็บเหลือในสแตก ให้ แสดง error 5 input : (({})[]) i n it ( ( ( ( ( ( ( ( ( ( (({} ( ( ) ( ( [ ( ( ]) ( ( ( ( { { { { ( ( [ [ [ [ ( (

6 การใช้สแตกช่วยแปลง นิพจน์คณิตศาสตร์ นิพจน์ INFIX (INFIX Notation) - ประโยค นิพจน์ทางคณิตศาสตร์ทั่วไปที่นิยมเขียนในรูป ของนิพจน์ที่มีตัวดำเนินการ (Operator) อยู่ ระหว่างตัวกระทำ (Operands) เช่น A+B นิพจน์ POSTFIX (POSTFIX Notation) - ประโยคนิพจน์ทางคณิตศาสตร์ที่เขียนอยู่ในรูป ของนิพจน์ที่มีตัวดำเนินการ (Operator) อยู่ หลังตัวกระทำ (Operands) เช่น AB+ 6

7 ความสำคัญของตัว ดำเนินการ เครื่องหมายความสำคัญเมื่อ อยู่ใน Stack ความสำคัญเมื่อ อยู่ที่อินพุต ** ( ยกกำลัง ) 34 *, /22 +, -11 (03

8 ลักษณะที่สำคัญของนิพจน์ POSTFIX คือ ตัวดำเนินการทุกตัวจะต้องอยู่หลังตัวกระทำ สองตัวเสมอ ตัวดำเนินการทุกตัวจะถูกวางให้อยู่ในลำดับ ที่ถูกต้องในการคำนวณ ไม่มีเครื่องหมายวงเล็บ () Ex.INFIX : A + B – C * D / E POSTFIX : A B + C D * E / – Ex.INFIX : A + ( B – C * D + E / F ) / G POSTFIX : A B C D * – E F / + G / + 8

9 หลักการใช้ stack แปลงนิพจน์ ทำการอ่านนิพจน์ infix เข้าสู่โปรแกรมทีละ 1 ตัวอักษร 1) ถ้าข้อมูลที่อ่านเข้ามาเป็น operand ให้นำไป เป็น output 2) ถ้าข้อมูลที่อ่านเข้ามาเป็น ( ให้ทำการ push ( ลง stack 3) ถ้าข้อมูลที่อ่านเข้ามาเป็น ) ให้ทำการ pop ข้อมูลออกจาก stack ไปเป็นผลลัพธ์ โดยทำ การ pop ข้อมูลออกไปจนกว่าข้อมูลที่ pop ออกมาเป็น ( แล้วทิ้งวงเล็บปิด, เปิด ไป 9

10 4) ถ้าข้อมูลที่อ่านเข้ามาเป็น operator ให้ ตรวจสอบว่า ถ้า stack ว่าง ให้ทำการ push operator ตัว นั้นลง stack ถ้า stack ไม่ว่าง 1. นำไปเปรียบเทียบกับ operator ที่ top of stack 2. ถ้าที่อ่านเข้ามามี priority น้อยกว่าหรือ เท่ากันกับ top A. pop operator ใน stack ไปที่ผลลัพธ์ B. ย้อนกลับไปทำ 1 อีกครั้ง 3. ถ้าที่อ่านเข้ามามี priority มากกว่า top หรือเจอ ( A. push operator ที่อ่านเข้ามาลง stack ถ้าหมดข้อมูล ให้ pop สิ่งที่เหลือในสแตกออกไป ที่ผลลัพธ์ 10

11 Input (infix) operator stack output (postfix) A-A ++A B+A B *+ *A B (+ * (A B C+ * (A B C -+ * ( -A B C D+ * ( -A B C D 11 INFIX : A + B * ( C – D / E ) / F

12 Input (prefix)operator stackoutput (postfix) /+ * ( - /A B C D E+ * ( - /A B C D E )+ *A B C D E / - /+ /A B C D E / - * F+ /A B C D E / - * F -- A B C D E / - * F / + 12 INFIX : A + B * ( C – D / E ) / F POSTFIX : A B C D E / – * F / +

13 การใช้สแตกช่วย ประมวลผลนิพจน์ postfix หลักการ ถ้าเป็น operand ให้ push ลง stack ถ้าเป็น operator ให้ pop ค่า 2 ค่า จากสแตก แล้วทำการคำนวณโดยใช้ operator ตัวนั้น ( ให้ใช้ค่าแรกที่ได้จากสแตกเป็น operand ตัว ที่ 2) จากนั้น push ผลลัพธ์ลงสแตก เมื่อทำงานจนหมดนิพจน์ ค่าสุดท้ายที่อยู่ในส แตกคือคำตอบ 13

14 infix : / 3 * 4 – 7 postfix : / 4 * + 7 – infix : / 3 * 4 – 7 postfix : / 4 * + 7 – 14 ini t / pop 3 pop 6 6 / 3 = 2 push * pop 4 pop 2 2 * 4 = 8 push pop 8 pop = 9 push pop 7 pop = 2 push

15 จากตัวอย่างการใช้งานสแตก จะเห็นได้ว่าใน การเขียนโปรแกรมจริง ควรมีอีก operation หนึ่งที่จำเป็นในการ access สแตก คือ operation ในการเรียกดูข้อมูลที่อยู่ ณ top of stack โดยที่ยังไม่ต้องการ pop ข้อมูล ออกมา int call_top ( STACK *s ) { return s->data[s->index]; } 15

16 การใช้สแตกช่วยในการ เรียกใช้ฟังก์ชัน เมื่อมีการเรียกใช้ฟังก์ชัน A จากโปรแกรมหลัก ระบบจะมีการบันทึก (push) ตัวแปร local และ address ของโปรแกรมหลักที่จะทำงานต่อหลัง จบฟังก์ชันแล้วเก็บลงสแตก ถ้าในฟังก์ชัน A มีการเรียกใช้ฟังก์ชัน B อีก ระบบจะทำการบันทึก (push) ตัวแปร local และ address ของฟังก์ชัน A ลงสแตก เหมือนกับตอนที่โปรแกรมหลักเรียกใช้ฟังก์ชัน A 16

17 เมื่อสิ้นสุดการทำงานของฟังก์ชัน B ระบบจะทำ การย้อนกลับไปทำงานที่ฟังก์ชัน A โดยดึง ข้อมูลต่างๆ จาก สแตก (pop) และสามารถ ทำงานที่ค้างอยู่จนเสร็จได้ เมื่อสิ้นสุดการทำงานของฟังก์ชัน A ระบบจะทำ การย้อนกลับไปทำงานที่โปรแกรมหลัก โดยดึง ข้อมูลต่างๆ จากสแตก (pop) เช่นกัน 17

18 18 Main progra m Functio n A Functio n B call A push (M) call B push (A) (M)(M) (A ) (M)(M) retu rn pop (A) (M)(M) retu rn pop (M)

19 การบ้ าน ให้แสดงวิธีการใช้สแตก เพื่อแปลงนิพจน์ ต่อไปนี้ ให้เป็นนิพจน์แบบ postfix INFIX : A + ( ( B – C ) / E + F ) – G * H / I POSTFIX : A B C – E / F + + G H * I / – INFIX : A – ( B + ( C + D * E ) * F ) POSTFIX : A B C D E * + F * + – INFIX : 1 / ( 2 * 3 – ( ) ) – 6 POSTFIX : * – / 6 – 19


ดาวน์โหลด ppt Stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์ เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการ สื่อสาร Website : ict.up.ac.th/yeunyong.

งานนำเสนอที่คล้ายกัน


Ads by Google