stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
Bansomdej Chaopraya Rajabhat University
Advertisements

โครงสร้างของภาษา C ในโปรแกรมที่พัฒนาด้วยภาษา C ทุกโปรแกรมจะมีโครงสร้างการพัฒนาไม่แตกต่างกัน ซึ่งประกอบด้วย 6 ส่วนหลัก ๆ โดยที่แต่ละส่วนจะมีหน้าที่แตกต่างกัน.
เรื่อง การแก้ไขปัญหาด้วยกระบวนการเทคโนโลยีสารสนเทศ
จงเขียนโปรแกรมในการคำนวณหาค่า function ข้างล่างโดยอาศัยหลักการ
โครงสร้างข้อมูลสแตก มีลักษณะเป็นรายการในแนวเชิงเส้น(Linear List)รูปแบบหนึ่ง และมีข้อกำหนดให้ชุดปฏิบัติการสามารถเพิ่มและลบรายการเพียงด้านเดียว ซึ่งเป็นด้านบนสุดของสแตก(Top.
บทที่ 2 รหัสควบคุมและการคำนวณ
Introduction to C Introduction to C.
รายวิชา ง40102 หลักการแก้ปัญหาและการโปรแกรม
โครงสร้างโปรแกรมภาษา C
ความรู้พื้นฐานเกี่ยวกับการเขียนโปรแกรม
โครงสร้างข้อมูลสแตก มีลักษณะเป็นรายการในแนวเชิงเส้น(Linear List)รูปแบบหนึ่ง และมีข้อกำหนดให้ชุดปฏิบัติการสามารถเพิ่มและลบรายการเพียงด้านเดียว ซึ่งเป็นด้านบนสุดของสแตก(Top.
Introduction to C Programming
สายอักขระและ การประมวลผลสายอักขระ (String and String manipulation)
Chapter 1 โครงสร้างข้อมูลและอัลกอริธึมส์
ข้อผิดพลาดของโปรแกรม และตัวดำเนินการ
สถาปัตยกรรมแบบ stack และ การผลิตโค๊ด
โครงสร้างการควบคุมการทำงานของโปรแกรม Program control structures
หลักการโปรแกรม 1 Lecture 3: ตัวแปร, นิพจน์คณิตศาสตร์, การคำนวณทางคณิตศาสตร์,การดำเนินการกับสายอักขระ.
Stack Holidays/seasonal content.
Data structure & Algorithms
ลักษณะการทำงานของ Stack
โครงสร้างภาษาซี.
หน่วยที่ 1 ระบบคอมพิวเตอร์
การจำลองความคิด
C Programming Lecture no. 6: Function.
การออกแบบโปรแกรมอย่างมีโครงสร้าง Structured Design
Operators ตัวดำเนินการ
บทที่ 3 ตัวดำเนินการ และ นิพจน์
การเขียนโปรแกรมคอมพิวเตอร์และอัลกอริธึม
บทที่ 11 การเขียนโปรแกรมภาษาซี
ตัวแปร (variable) ตัวแปร เป็นชื่อที่เราตั้งขึ้น เพื่อให้คอมพิวเตอร์เตรียมที่ใน หน่วยความจำไว้สำหรับเก็บข้อมูลที่นำไปประมวลผล การตั้งชื่อตัวแปร ชื่อตัวแปรในภาษา.
การคำนวณทางคณิตศาสตร์ ตัวดำเนินการ
ตัวดำเนินการ(Operator)
Infix to Postfix มหาวิทยาลัยเนชั่น หลักการภาษาชุดคำสั่ง
โครงสร้างข้อมูลแบบคิว
วิชา เทคโนโลยีสารสนเทศ เรื่อง. หลักการทำงาน และ
ทบทวน กันก่อน .....กระบวนการแปลโปรแกรม
Week 2 Variables.
เสรี ชิโนดม ฟังก์ชัน เสรี ชิโนดม
Computer Programming for Engineers
2.1 วิธีแก้ปัญหาด้วยคอมพิวเตอร์ (Computer problem solving methods)
วิทยา กรระสี (วท.บ. วิทยาการคอมพิวเตอร์)
ฟังก์ชัน.
Operators ตัวดำเนินการ
บทที่ 4 นิพจน์ทางคณิตศาสตร์.
หลักการเขียนโปรแกรม ( )
กองซ้อน ยอดกองซ้อน (stack).
โครงสร้างข้อมูลแบบกองซ้อน (Stack)
ตัวดำเนินการ และนิพจน์คณิตศาสตร์
ต้นไม้ Tree (2) ผู้สอน อาจารย์ ยืนยง กันทะเนตร
Chapter 3 - Stack, - Queue,- Infix Prefix Postfix
หลักการเขียนโปรแกรม ( )
Recursive Method.
การแก้ปัญหาโปรแกรม (Flowchart)
หลักการเขียนโปรแกรม ( )
แนะนำการเขียนโปรแกรมภาษา C Introduction to C Programming Language
ซอฟต์แวร์ (Softwarre)
การกระทำทางคณิตศาสตร์
การจัดเรียงข้อมูล (sorting)
1 Functions กนกวรรธน์ เซี่ยงเจ็น สำนักวิชาเทคโนโลยีสารสนเทศ และการสื่อสาร มหาวิทยาลัยนเรศวร พะเยา.
stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
การรับและแสดงผลข้อมูล (Input/Output)
โครงสร้างข้อมูลแบบ สแตก (stack)
ต้นไม้ Tree [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
CHAPTER 2 Operators.
รายการ (Lis t) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการสื่อสาร Website : ict.up.ac.th/yeunyong.
ต้นไม้ Tree [1] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
หลักการทั่วไปเกี่ยวกับการเขียนโปรแกรม
การประยุกต์ใช้ Stack การประยุกต์ใช้ Stack
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
ใบสำเนางานนำเสนอ:

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

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

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

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

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

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

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

ลักษณะที่สำคัญของนิพจน์ 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 / +

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

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

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

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 / +

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

init 1 6 infix : 1 + 6 / 3 * 4 – 7 postfix : 1 6 3 / 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

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

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

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

Main program (M) return pop (M) call A push (M) Function A (M) (A) (M) return pop (A) call B push (A) Function B

การบ้าน ให้แสดงวิธีการใช้สแตก เพื่อแปลงนิพจน์ต่อไปนี้ ให้เป็นนิพจน์แบบ 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 – ( 4 + 5 ) ) – 6 POSTFIX : 1 2 3 * 4 5 + – / 6 –