ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
1
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
สาขาวิชาเทคโนโลยีคอมพิวเตอร์เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการสื่อสาร Website : ict.up.ac.th/yeunyong
2
หัวข้อวันนี้ Application of stack การใช้สแตกช่วยในการ compile program
การใช้สแตกช่วยแปลงนิพจน์คณิตศาสตร์ การใช้สแตกช่วยประมวลผลนิพจน์ postfix การใช้สแตกช่วยในการเรียกใช้ฟังก์ชัน
3
Application of stack สแตกเป็นโครงสร้างข้อมูลที่มีประโยชน์
ส่วนใหญ่จะอยู่ในซอฟแวร์ระบบ (System software) ใช้ใน compiler การเรียกใช้ function, recursive การแปลงนิพจน์ และการคำนวณนิพจน์ ฯลฯ ผู้ใช้ทั่วไปอาจไม่ทราบ เพราะถูกซ่อนเอาไว้
4
สแตกช่วยจัดการด้านโปรแกรมมิ่งอย่างไร ?
สิ่งหนึ่งที่สำคัญในการคอมไพล์โปรแกรม คือ การตรวจเช็คในเรื่องของเครื่องหมายวงเล็บ ( ) [ ] { } ถ้าขาดสัญลักษณ์ข้างซ้ายหรือขวาไป -> โปรแกรมนั้นมี syntax error { ( ) [ ( ) ] { } [ { } [ ] ] [ ] ( [ ] ) [ ] ( { } [ { ( ) ] } [ ] ) สามารถใช้ stack ช่วยในการตรวจสอบได้
5
input : (({})[]) ( ( { } ) [ ] ) ( ( { { ( ( ( ( ( ( [ [ ( (
เมื่ออ่านเจอวงเล็บเปิด ให้ push ลงสแตก เมื่ออ่านเจอวงเล็บปิด ให้ตรวจสอบ top of stack ว่ามีวงเล็บเปิดชนิดเดียวกันหรือไม่ ถ้ามีให้ pop ออกมา แต่ถ้าไม่มี ให้แสดง error เมื่ออ่านหมดแล้วถ้ามีวงเล็บเหลือในสแตก ให้แสดง error input : (({})[]) init ( ( { } ) [ ] ) ( ( { { ( ( ( ( ( ( [ [ ( (
6
การใช้สแตกช่วยแปลงนิพจน์คณิตศาสตร์
นิพจน์ INFIX (INFIX Notation) - ประโยคนิพจน์ทางคณิตศาสตร์ทั่วไปที่นิยมเขียนในรูปของนิพจน์ที่มีตัวดำเนินการ (Operator) อยู่ระหว่างตัวกระทำ (Operands) เช่น A+B นิพจน์ POSTFIX (POSTFIX Notation) - ประโยคนิพจน์ทางคณิตศาสตร์ที่เขียนอยู่ในรูปของนิพจน์ที่มีตัวดำเนินการ (Operator) อยู่หลังตัวกระทำ (Operands) เช่น AB+
7
ความสำคัญของตัวดำเนินการ
เครื่องหมาย ความสำคัญเมื่ออยู่ในStack ความสำคัญเมื่ออยู่ที่อินพุต ** (ยกกำลัง) 3 4 * , / 2 + , - 1 (
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 / +
9
หลักการใช้ stack แปลงนิพจน์
ทำการอ่านนิพจน์ infix เข้าสู่โปรแกรมทีละ 1 ตัวอักษร 1) ถ้าข้อมูลที่อ่านเข้ามาเป็น operand ให้นำไปเป็น output 2) ถ้าข้อมูลที่อ่านเข้ามาเป็น ( ให้ทำการ push ( ลง stack 3) ถ้าข้อมูลที่อ่านเข้ามาเป็น ) ให้ทำการ pop ข้อมูลออกจาก stack ไปเป็นผลลัพธ์ โดยทำการ pop ข้อมูลออกไปจนกว่าข้อมูลที่ pop ออกมาเป็น ( แล้วทิ้งวงเล็บปิด,เปิด ไป
10
4) ถ้าข้อมูลที่อ่านเข้ามาเป็น operator ให้ตรวจสอบว่า
ถ้า stack ว่าง ให้ทำการ push operator ตัวนั้นลง stack ถ้า stack ไม่ว่าง นำไปเปรียบเทียบกับ operator ที่ top of stack ถ้าที่อ่านเข้ามามี priority น้อยกว่าหรือเท่ากันกับ top pop operator ใน stack ไปที่ผลลัพธ์ ย้อนกลับไปทำ 1 อีกครั้ง ถ้าที่อ่านเข้ามามี priority มากกว่า top หรือเจอ ( push operator ที่อ่านเข้ามาลง stack ถ้าหมดข้อมูล ให้ pop สิ่งที่เหลือในสแตกออกไปที่ผลลัพธ์
11
INFIX : A + B * ( C – D / E ) / F Input (infix) operator stack
output (postfix) A - + B A B * + * ( + * ( C A B C + * ( - D A B C D
12
INFIX : A + B * ( C – D / E ) / F POSTFIX : A B C D E / – * F / +
Input (prefix) operator stack output (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 / + POSTFIX : A B C D E / – * F / +
13
การใช้สแตกช่วยประมวลผลนิพจน์ postfix
หลักการ ถ้าเป็น operand ให้ push ลง stack ถ้าเป็น operator ให้ pop ค่า 2 ค่า จากสแตก แล้วทำการคำนวณโดยใช้ operator ตัวนั้น (ให้ใช้ค่าแรกที่ได้จากสแตกเป็น operand ตัวที่ 2) จากนั้น push ผลลัพธ์ลงสแตก เมื่อทำงานจนหมดนิพจน์ ค่าสุดท้ายที่อยู่ในสแตกคือคำตอบ
14
init 1 6 infix : / 3 * 4 – 7 postfix : / 4 * + 7 – 2 1 6 1 3 / 4 * pop 3 pop 6 6 / 3 = 2 push 2 pop 4 pop 2 2 * 4 = 8 push 8 1 6 3 1 6 3 1 4 1 2 1 2 4 1 2 8 + 7 - pop 8 pop 1 1 + 8 = 9 push 9 pop 7 pop 9 9 - 7 = 2 push 2 1 8 9 9 7 7 9 2
15
จากตัวอย่างการใช้งานสแตก จะเห็นได้ว่าในการเขียนโปรแกรมจริง ควรมีอีก operation หนึ่งที่จำเป็นในการ access สแตก คือ operation ในการเรียกดูข้อมูลที่อยู่ ณ top of stack โดยที่ยังไม่ต้องการ pop ข้อมูลออกมา int call_top ( STACK *s ) { return s->data[s->index]; }
16
การใช้สแตกช่วยในการเรียกใช้ฟังก์ชัน
เมื่อมีการเรียกใช้ฟังก์ชัน A จากโปรแกรมหลัก ระบบจะมีการบันทึก (push) ตัวแปร local และ address ของโปรแกรมหลักที่จะทำงานต่อหลังจบฟังก์ชันแล้วเก็บลงสแตก ถ้าในฟังก์ชัน A มีการเรียกใช้ฟังก์ชัน B อีก ระบบจะทำการบันทึก (push) ตัวแปร local และ address ของฟังก์ชัน A ลงสแตกเหมือนกับตอนที่โปรแกรมหลักเรียกใช้ฟังก์ชัน A
17
เมื่อสิ้นสุดการทำงานของฟังก์ชัน B ระบบจะทำการย้อนกลับไปทำงานที่ฟังก์ชัน A โดยดึงข้อมูลต่างๆ จาก สแตก (pop) และสามารถทำงานที่ค้างอยู่จนเสร็จได้ เมื่อสิ้นสุดการทำงานของฟังก์ชัน A ระบบจะทำการย้อนกลับไปทำงานที่โปรแกรมหลัก โดยดึงข้อมูลต่างๆ จากสแตก (pop) เช่นกัน
18
Main program (M) return pop (M) call A push (M) Function A (M) (A) (M) return pop (A) call B push (A) Function B
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 –
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.