Bansomdej Chaopraya Rajabhat University Stack Bansomdej Chaopraya Rajabhat University
เนื้อหา โอเปอร์เรชั่นของสแตค โพลิช โนเทชั่น คิว รีเคอร์ซีฟ สรุป การแปลงสมการจาก Infix เป็น Postfix การหาผลลัพธ์จากนิพจน์ Postfix คิว รีเคอร์ซีฟ สรุป Stack Slide#2
สแตค สแตค เป็นรูปแบบหนึ่งในการจัดเรียงข้อมูลแบบเชิงเส้น ที่มีการใส่ข้อมูลเข้า และนำข้อมูลออกเพียงด้านใดด้านหนึ่ง มีกระบวนการทำงานแบบ First In Last Out : FILO ตัวอย่างที่ดีที่สุดของการจัดเรียงแบบสแตค คือการวางซ้อนกันของจาน ซึ่งจานที่วางก่อนจะอยู่ข้างล่าง และจานที่ถูกวางที่หลังจะอยู่ข้างบน เวลาที่นำจานออกมาใช้ ก็จะใช้ด้านบนสุดก่อน ดังตัวอย่าง Stack Slide#3
ตัวอย่างโครงสร้างแบบสแตค ข้อมูลที่ป้อนลงมาเป็นตัวสุดท้าย ข้อมูลที่ป้อนลงมาเป็นตัวแรก Stack Slide#4
โอเปอร์เรชั่นของสแตค โอเปอร์เรชั่นของสแตคมี 2 โอเปอร์เรชั่น คือ การนำข้อมูลเข้าสู่สแตค Push การนำข้อมูลออกจากสแตค Pop Stack Slide#5
การนำข้อมูลเข้าสู่สแตค : Push ตัวอย่าง ต้องการนำข้อมูลต่อไปนี้เข้าสู่ สแตคที่ว่างเปล่า กำหนดข้อมูลดังต่อไปนี้ A, B, C,D Stack Slide#6
ตัวอย่าง Push A Max Stack Top = 1 Top = 0 Stack Slide#7
ตัวอย่าง Push B Max Stack Top = 2 Top = 1 Stack Slide#8
ตัวอย่าง Push C Max Stack Top = 3 Top = 2 Stack Slide#9
ตัวอย่าง Push D Max Stack Top = 4 Top = 3 Stack Slide#10
โปรแกรม Push ข้อมูลลง Stack /* pushes item on the stack */ void push ( int data ) { if ( top == MAX - 1 ) printf(”\nStack is full“); else top++ ; stack[ top ] = data ; } Stack Slide#11
การนำข้อมูลออกจากสแตค : Pop ตัวอย่าง ต้องการนำข้อมูล A, B, C,D เข้าออกจากสแตค Stack Slide#12
ตัวอย่าง Pop D Max Stack Top = 4 Top = 3 Stack Slide#13
ตัวอย่าง Pop C Max Stack Top = 3 Top = 2 Stack Slide#14
ตัวอย่าง Pop B Max Stack Top = 2 Top = 1 Stack Slide#15
ตัวอย่าง Pop A Max Stack Top = 1 Top = 0 Stack Slide#16
โปรแกรม POP ข้อมูลออกจาก Stack /* pops off the items from the stack */ int pop( ) { int data ; if ( top == -1 ) printf("\nStack is empty“); return ( -1 ) ; } else { data = stack[ top ] ; top-- ; return ( data ) ; Stack Slide#17
บทที่ 4 โครงสร้างข้อมูลแบบสแตก และคิว โอเปอร์เรชั่นของสแตก โพลิช โนเทชั่น การแปลงสมการจาก Infix เป็น Postfix การหาผลลัพธ์จากนิพจน์ Postfix คิว สรุป
โครงสร้างข้อมูลแบบสแตก และคิว เป็นโครงสร้างข้อมูลแบบเชิงเส้น โดยลักษณะของโครงสร้างแบบสแตก ข้อมูลถูกจัดเข้าก่อนจะออกที่หลัง เรียกว่า “First in last out” / “FILO” โดยลักษณะของโครงสร้างแบบคิว ข้อมูลถูกจัดเข้าก่อนจะ นำออกก่อน เรียกว่า “First in first out” / “FIFO” โดยมีการนำโครงสร้างพื้นฐานที่เป็นอาร์เรย์ หรือ ลิงค์ลิสต์ มาใช้ในการจัดการข้อมูล
Chapter 4 Stack and Queue (linear structure) ตัวอย่าง การจัดเรียงข้อมูลแบบสแตก - การจัดวางซ้อนกันของจาน / สิ่งของที่วางซ้อนกัน
Chapter 4 Stack and Queue 4.2.1 Operations on Stack สำหรับการจัดเรียงข้อมูล การนำเข้าข้อมูลในสแตกจะ เรียกว่า พุช (Push) การนำข้อมูลออกจากสแตก เรียกว่า พอพ (Pop) ด้านของข้อมูลที่มีการนำข้อมูลเข้าออกเรียกว่า ท็อป (Top) (a) A, B, C, D, E (b) A Push: A (c) A, B, C, D, E (d) A, B, C, D Pop: E Top Top
Chapter 4 Stack and Queue Operations on Stack การนำข้อมูลออกจากสแตก A, B, C, D, E A, B, C, D Pop : E A, B, C Pop : D A, B Pop : C A, B, D Push : D A, B, D, E Push : E Top E Push : E Top Top E, D Push : D Top Top E, D Top Top E Pop : D Top Top Pop : E Top STACK X STACK Y
Chapter 4 Stack and Queue Operations on Stack การพิจารณาเกี่ยวกับหน่วยความจำ การพิจารณาหน่วยความจำที่ใช้และจำนวนครั้งของการ OVERFLOW ในกรณีที่จะ Push เข้าสแตก จนครบ MAXSTK - เกิด OVERFLOW บ่อย เมื่อเตรียมหน่วยความจำน้อย - จะไม่เกิด OVERFLOW เมื่อเตรียมหน่วยความจำมาก การใช้หน่วยความจำร่วมกันระหว่าง 2 สแตก MAXSTK1 + MAXSTK2 1 2 3 4 n-3 n-2 n-1 n … … STACK2 STACK1 การใช้สแตกร่วม
Chapter 4 Stack and Queue Operations on Stack Program Main … begin call sub 1 end; Program sub 1 call sub 2 Program sub2 … begin call sub 3 end; Program sub 3 Sub 2 Sub 1 Sub 1 Sub 1 Main Main Main Main Main (a) (b) (c) (d) (e) (f) การเก็บข้อมูลสแตกของโปรแกรม Main
Chapter 4 Stack and Queue 4.2.2 Implementation of Stack as Static Array สแตกสามารถแสดงได้หลายวิธีโดยรูปแบบคอมพิวเตอร์ การใช้อาร์เรย์เป็นวิธีหนึ่ง โดยสแตกจะมีตัวแปรทำหน้าที่เป็น ตัวบอกจุดสูงสุดของสแตก คือ Top MAXSTK Top = 0; Top = NULL
Chapter 4 Stack and Queue Implementation of Stack as Static Array Procedure PUSH(STACK,TOP,MAXSTK,ITEM) ขบวนการนี้เป็นการนำ ITEM ใส่ใน STACK if TOP = MAXSTK, then : Print OVERFLOW and RETURN Set TOP = TOP +1 Set STACK[TOP] : = ITEM return. Procedure POP(STACK,TOP,ITEM) ขบวนการนี้เป็นการลบข้อมูล ITEM ที่ TOP ของ STACK if TOP = 0, then : Print OVERFLOW and RETURN Set ITEM : = STACK[TOP] Set TOP : = TOP - 1 return.
โพลิช โนเทชั่น (Polish Notation) โพลิช โนเทชั่น เป็นวิธีการในการจัดรูปแบบของสมการใหม่ โดยแสดงสมการทางคณิตศาสตร์ให้อยู่ในรูปเครื่องหมายทางคณิตศาสตร์อยู่ก่อนตัวถูกดำเนินการ (โพลิช โนเทชั่น เป็นชื่อที่ตั้งขึ้นมาตามชื่อของ ตำรวจเจน ลูคาวิคซ์ ผู้คิดให้เครื่องหมายอยู่หน้าตัวดำเนินการ นี้) ตัวอย่างของ สมการ โพลิช โนเทชั่น 2*3 แปลงเป็นสมการโพลิช โนเทชั่น เท่ากับ *23 Stack Slide#27
Chapter 4 Stack and Queue การกำหนดลำดับความสำคัญของการทำงานในการคำนวณคณิตศาสตร์ 2+3*5 สูงสุด : ยกกำลัง (^) สูงถัดมา : คูณ (*) หาร (/) ต่ำสุด : บวก (+) ลบ (-) ในกรณีเป็นผู้กำหนดความสำคัญโดยใช้วงเล็บ() (2+3)*5 ตัวเลข เรียกว่า Operand
Chapter 4 Stack and Queue โพลิช โนเทชั่น เป็นวิธีการจัดรูปแบบสมการใหม่ การเขียนเครื่องหมาย อยู่หน้าตัวดำเนินการ เช่น 2*3 เขียนเป็น *23 2+3 เขียนเป็น +23 ในกรณีมีเครื่องหมายหลายตัว (5+2)*3 = (+52)*3 = *+523 (5^2)+((4*6)/3) = (^52)+((*46)/3) = (^52)+(/*463) = +^52/*463 การเขียนสมการแบบนี้ไม่ต้องใช้วงเล็บและลำดับความสำคัญ
ศัพท์ที่ควรทราบ Operand คือ ตัวถูกดำเนินการใดๆ เช่น A, B, C Operator คือ เครื่องหมายในการดำเนินการ เช่น + , -, *, / Infix คือสมการที่อยู่ในรูปของ Operand คั่นด้วยOperator Prefix คือสมการที่อยู่ในรูปของ Operator แล้วตามด้วย Operand Postfix คือสมการที่อยู่ในรูปของ Operand แล้วตามด้วย Operator Infix : A+B Prefix : +AB Postfix : AB+ Stack Slide#30
ลำดับความสำคัญของเครื่องหมายทางคณิตศาสตร์ Precedence เมื่ออยู่ที่ อินพุต Precedence เมื่ออยู่ในสแตค ^ 4 3 *, / 2 +, - 1 ( , ) Stack Slide#31
การแปลงสมการ Infix เป็นสมการ Postfix 1. ถ้าอินพุตเป็นตัว Operand ให้นำไปไว้ที่เอาท์พุต 2. ถ้าอินพุตเป็นตัว Operator ให้ทำดังนี้ 2.1 นำ Operator ตัวนั้นเข้าสู่สแตค ถ้าสแตคว่างเปล่าจะถือว่าเป็น opst : Operator Stack 2.2 ถ้า สแตคนั้นไม่ว่างนั่นคือมีOperator อยู่แล้วให้เปรียบเทียบ Precedence ของ Operator ที่เป็นอินพุต กับ Precedence ของ Operator ที่อยู่ในสแตค หากพบว่า Stack Slide#32
การแปลงสมการ Infix เป็นสมการ Postfix 2.2.1 ถ้าพบว่า ค่าOperator ในอินพุตน้อยกว่าหรือเท่ากับให้ทำการ Pop Operatorใน Stack ออกมายัง Output 2.2.2 ถ้าพบว่า ค่าOperator ในอินพุตมากกว่าให้นำ Operatorนั้นบรรจุลงใน Stack 2.2.3 ถ้าเป็นเครื่องหมาย ( ให้ push ลงสู่ Stack จนกว่าจะพบเครื่องหมาย ) หรือ stack จะว่าง 2.2.4 ถ้าเป็นเครื่องหมาย ) ให้ Pop ข้อมูลทั้งหมดรวมทั้ง Operator ออกมาแล้วนำไปไว้ที่เอาท์พุต Stack Slide#33
ตัวอย่างที่ 1 จงแปลง A+B+Cให้เป็น Postfix Input Stack Output A + B AB AB+ C AB+C+ Stack Slide#34
ตัวอย่างที่ 2 จงแปลง A+B/C*D-E ให้เป็น Postfix Input Stack Output A + B AB / +,/ C ABC * +,* ABC/ D ABC/D - ABC/D*+ E ABC/D*+E- Stack Slide#35
ตัวอย่างที่ 3 A + B * C + ( D * E + F ) * G INPUT STACK OUTPUT A A + B Stack Slide#36
จงแปลงนิพจน์ Infix ต่อไปนี้ เป็นนิพจน์ Postfix [1] A + B * ( C ^ D * E / F ) – G [2] A ^ 2 – 4 * ( A * C + ( E + ( F – G ) – H ) ) [3] A ^ B * C / D * ( E ^ 3 ^ 2 ) Stack Slide#37
การหาผลลัพธ์จากนิพจน์ Postfix [1] เมื่ออ่านพบ operand ให้ push ลง stack [2] ถ้าเป็น operator ให้ pop ตัว operand ออกมา 2 ตัว เพื่อคำนวณ [3] ผลลัพธ์ที่ได้ทำการ push ลง stack Stack Slide#38
ตัวอย่างการหาผลลัพธ์ ตัวอย่าง กำหนดให้ A=5 , B=2 , C=3 จงหาผลลัพธ์ ของ AB+C+ Output Stack Process 5 2 5,2 + 5+2 3 7,3 7+3=10 Stack Slide#39
จงหาค่าของนิพจน์ Postfix ต่อไปนี้ กำหนดให้ A=5, B=3, C=2, D=1, E=2, F=3, G=1, H=2 [1] AB+CD-* [2] ABC*+DE*F+G*+ [3] ให้หาค่านิพจน์ postfix ที่ได้จากโจทย์ในแบบฝึกหัดที่ ผ่านมา Stack Slide#40
แบบทดสอบการประยุกต์ใช้งานสแตค เขียนโปรแกรมการแปลงนิพจน์ Infix เป็น Postfix Stack Slide#41
Chapter 4 Stack and Queue 4.2.3 Arithmetic Expression Notation การกำหนดลำดับความสำคัญของการทำงานในการ คำณวนคณิตศาสตร์ 2+3*5 สูงสุด : ยกกำลัง (^) สูงถัดมา : คูณ (*) หาร (/) ต่ำสุด : บวก (+) ลบ (-) ในกรณีเป็นผู้กำหนดความสำคัญโดยใช้วงเล็บ() (2+3)*5 ตัวเลข เรียกว่า Operand
Chapter 4 Stack and Queue Arithmetic Expression Notation โพลิช โนเทชั่น เป็นวิธีการจัดรูปแบบสมการใหม่ การ เขียนเครื่องหมายอยู่หน้าตัวดำเนินการ เช่น 2*3 เขียนเป็น *23 2+3 เขียนเป็น +23 ในกรณีมีเครื่องหมายหลายตัว (5+2)*3 = (+52)*3 = *+523 (5^2)+((4*6)/3) = (^52)+((*46)/3) = (^52)+(/*463) = +^52/*463 การเขียนสมการแบบนี้ไม่ต้องใช้วงเล็บและลำดับความ สำคัญ