การประยุกต์ใช้ Stack การประยุกต์ใช้ Stack 1) ใช้เรียก Function ใน บางภาษา n = 10; printf(“%d %d”, n, n++); //++n หรือ ++n, n 2) Recursive การเรียก function ตัวมันเอง เช่น N! หรือสมการ fibunacy (กบโดดบ่อ) fn = fn-2+ fn-1
การประยุกต์ใช้ Stack Factorial(N) { if (N=1) return (1); else return (N * Factorial(N-1)); } 3) Infix & Postfix Notation Infix : 1) A + B 2) A + B * C
การประยุกต์ใช้ Stack Postfix : 1) A B + 2) A B C * + ขั้นตอนการดำเนินการ (ด้วยมือ) 1) A + B * C A + [ BC* ] A B C * + 2) (A + B) * (C-D) / E * P – 1 [ AB+ ] * [ CD- ] / E * P – 1
การประยุกต์ใช้ Stack [ AB+CD-* ] / E * P – 1 [ AB+CD-* E/ ] * P – 1 Home Work 1) A+B*C/(E-F*G**2)-D 2) –A^B-1/(G+P)*(R+1) >10 || A 3) !(A && !(B<C || D>E)) || F<G
การเปลี่ยน Infix เป็น Postfix โดยใช้ Stack ศัพท์ที่ควรรู้ - Priority : อภิสิทธ์, ศักดินา, สิทธิ์, ความสำคัญ - In coming Priority (ICP) - In stack Priority (ISP) - Operator : + - * / ^ - Operand : ตัวแปร หรือ ค่าคงที่ เช่น A, B, 5 หลักการ 1. ถ้าเป็น Operand ใส่ลงใน Postfix เลย 2. ถ้าเป็น Operator และ ICP>ISP ใส่ลงใน Stack
การเปลี่ยน Infix เป็น Postfix โดยใช้ Stack มิเช่นนั้น Pop ออก และไปต่อที่ Postfix จนกว่าจะเป็น จริง หรือ หมด; ถ้าเป็น ‘)’ Pop ออก และนำไปต่อที่ Postfix จนกว่าจะเจอ ‘(‘ ก็ Pop ออกแล้วโยนทิ้งไปเลย 3. ถ้าหมด Infix, ให้ Pop ออกจาก Stack แล้วนำไปต่อที่ Postfix จนกว่าจะหมด 4. ข้อสังเกต - การ Implement ยังคงใช้ Array - ถ้า Pop ออกเป็น ‘(’ ไม่ต้องนำไปต่อ
Priority ( 0 6 ~ (-) 5 5 ^ (**) 3,4 4 * 2 2 / 2 2 + 1 1 - 1 1 ) - - Symbol ISP ICP ( 0 6 ~ (-) 5 5 ^ (**) 3,4 4 * 2 2 / 2 2 + 1 1 - 1 1 ) - -
การเปลี่ยน Infix เป็น Postfix โดยใช้ Stack ** Symbol หรือเรียกว่า Token เป็น Char. ที่ฉีกออกจาก String ใน Infix Ex A + B * C เป็น Infix ถูกเก็บไว้ใน Array หรือ String จงแปลงให้เป็น Postfix. Token Operator Operand (Postfix) Stack A A + + + B A B + * * + *
การเปลี่ยน Infix เป็น Postfix โดยใช้ Stack Token Operator Operand (Postfix) Stack C A B C + * - - - - - - - - - - - - - หมด - - - - - - - - - - - - - Pop Stack จนหมด สุดท้ายจะได้ A B C * + *** - Stack, Infix, Postfix : Implement ด้วย Array - Operand ในที่นี้ใช้เพียง 1 character
การประยุกต์ใช้ Stack การบ้าน จงแปลง Infix เป็น Postfix โดยอาศัย Stack (A + B)/C^3 - A * D + E / F – P A + B ^ 2 / F –A * (B – D / F ^ (H + W)) Algorithm การแปลง Infix ให้เป็น Postfix ดูได้จากอีก Slide
การประยุกต์ใช้ Stack การคิดค่าของนิพจน์ (Expression) 1) จาก Infix แปลงเป็น Postfix 2) Postfix จะอยู่ในรูป String ฉีกมาทีละ Token จากซ้ายไปขวา 3) ถ้าเป็น Operand ตรวจดูว่ามีค่าในตารางหรือยัง ถ้ายังให้รับค่า แล้วใส่ลงใน Stack ตัวเลข (Stack คนละอันกับ Stack อันก่อน)
การประยุกต์ใช้ Stack การคิดค่าของนิพจน์ (Expression) (ต่อ) 4) ถ้าเป็น Operator ให้ Pop มาสองค่าจาก Stack แล้วนำมา Operate กัน ตามเครื่องหมาย (ค่าบนอยู่ด้านขวา) ยกเว้น เครื่องหมาย ‘~’ Pop มาค่าเดียวแล้วคูณด้วย –1, นำผลลัพธ์ใส่กลับเข้า Stack 5) ทำไปเรื่อย ๆ จนหมด String ของ Postfix จะได้ผลลัพธ์ สุดท้าย ที่ก้น Stack
การประยุกต์ใช้ Stack Exam infix : A + B * C จะได้ Postfix : A B C * + Token Op. Operand Stack A A (รับค่า) 10 B B (รับค่า) 10, 2 C C (รับค่า) 10, 2, 3 * * (2*3=6) 10, 6 + + (10+6=16) 16 *** ผลลัพธ์คือ 16
การบ้าน จาก infix : -A - B / A ให้หาค่านิพจน์นี้โดยอาศัย Stack, กำหนดให้ A = 4; B = 20;