Stack Holidays/seasonal content
Stack คุณลักษณะของสแตก การนำข้อมูลเข้าและออกจากสแตกจะกระทำที่ปลายข้างเดียวเท่านั้น การทำงานของสแตกจะมีลักษณะแบบ เข้าหลัง ออกก่อน (LIFO: Last In, First Out) ตัวอย่างการทำงานแบบ LIFO เช่น การวางจานซ้อนกัน
Stack ประโยชน์ของสแตก เพื่อแปลงนิพจน์ทางคณิตศาสตร์ การจัดลำดับการทำงานแบบ recursive หรือการเรียกใช้ฟังก์ชัน เป็นกลไกสำคัญในการทำงานของ compiler เช่น การตรวจสอบเครื่องหมาย { } ในภาษาซี หรือการตรวจสอบเครื่องหมายวงเล็บ
Stack การสร้างสแตก สามารถใช้อาเรย์ หรือ Linked List แทนได้ มีตัวชี้ 1 ตัวสำหรับชี้ที่สมาชิกตัวบนสุดของสแตก สมมติให้เป็น TOP กรณีสแตกว่าง กำหนดให้ค่า TOP = 0 กรณี TOP=N เมื่อ N คือขนาดของสแตก แสดงว่าสแตกเต็ม Empty stack Full stack TOP=N A A A D C B A TOP=0
Stack Operation ของสแตก การเพิ่มข้อมูลลงในสแตก (PUSH) การดึงข้อมูลออกจากสแตก (POP)
Stack การเพิ่มข้อมูลลงในสแตก (PUSH) ในการ PUSH ข้อมูลต้องตรวจสอบก่อนว่าสแตกเต็มหรือไม่ โดยใช้เงื่อนไข TOP = N หรือไม่ เมื่อ N คือขนาดของสแตก หาก TOP = N แสดงว่าสแตกเต็ม หากสแตกเต็มจะไม่สามารถนำข้อมูลเข้าไปในสแตกได้อีก
Stack PUSH ALGORITHM Push(stack,max,top,item) if(max=top) write “Full Stack” else top ← top + 1 stack[top] = item หมายเหตุ: stack คือ ชื่ออาเรย์ที่ใช้เก็บข้อมูลในสแตก max คือ ขนาดของสแตก top ใช้เก็บตำแหน่งบนสุดของสแตก Item แทนข้อมูลที่ต้องการ push ลงในสแตก
Stack ตัวอย่าง PUSH Empty stack Push(A) Push(B) Push(C) Push(D) TOP=0 Push(A) A TOP=1 Push(B) B TOP=2 A Push(C) B TOP=3 A C Push(D) B TOP=4 A C D Push(E) B TOP=4 A C D Error:Full Stack
Stack การดึงข้อมูลออกจากสแตก (POP) ในการ POP ข้อมูลต้องตรวจสอบก่อนว่ามีข้อมูลอยู่ในสแตกหรือไม่ โดยใช้เงื่อนไข TOP = 0 หาก TOP = 0 แสดงว่าสแตกว่างเปล่า หากสแตกว่างเปล่าจะไม่สามารถดึงข้อมูลออกจากสแตกได้
Stack POP ALGORITHM Pop(top) if(top=0) write “Empty Stack” else top ← top - 1 หมายเหตุ: top ใช้เก็บตำแหน่งบนสุดของสแตก
Stack ตัวอย่าง POP Pop Pop Pop Pop Pop Pop Error: Empty Stack B A C D TOP=4 A C D Pop B TOP=3 A C B Pop TOP=2 A A Pop TOP=1 Pop TOP=0 Pop TOP=0 Error: Empty Stack
การใช้ สแตก เพื่อแปลงเลขฐานสิบเป็นเลขฐานสอง Algorithm 1. loop (number > 0) 1.1 b = number modulo 2 1.2 push (stack,b) 1.3 number = number / 2 2. loop (not empty(stack)) 2.1 pop(stack) 1 1 1 ตัวอย่าง: 11 ---> 1011 pop stack 1 top top stack 1 top stack 1 top stack 1
Parenthesis matching ตัวอย่าง: ((A + B) / C) Algorithm 1. loop (more data) 1.1 If character is ‘(‘ 1.1.1 push(stack, character) 1.2 else if character is ‘)’ 1.2.1 if empty (stack) then error 1.2.2 else pop(stack) 2. if not empty(stack) 2.1 error ตัวอย่าง: ((A + B) / C) stack ( top push(‘(’) stack ( top push(‘(’) stack ( top pop stack top pop
Parenthesis matching ตัวอย่าง: (A + B) + C) error Algorithm 1. loop (more data) 1.1 If character is ‘(‘ 1.1.1 push(stack, character) 1.2 else if character is ‘)’ 1.2.1 if empty (stack) then error 1.2.2 else pop(stack) 2. if not empty(stack) 2.1 error stack empty stack error ตัวอย่าง: (A + B) + C) stack ( top push(‘(’) pop stack top
การใช้ สแตก เพื่อแปลงนิพจน์ทางคณิตศาสตร์ รูปแบบนิพจน์ทางคณิตศาสตร์ Infix : A + B * C - D / E Postfix : A B C * + D E / - Operators priority priority 3 : + - priority 2 : * / priority 1 : ^ priority 0 : ( น้อย มาก
Infix to Postfix Transformation Algorithm infix2postfix 1. CreateStack (s) 2. Loop (for each character in infix) 2.1 if (character = ‘(‘) 2.1.1 pushStack (s, character) 2.2 elseif (character = ‘)’) 2.2.1 popStack (s, character) 2.2.2 loop (character ≠ ‘(‘) 1. print character 2. popStack (s, character)
Infix to Postfix Transformation Algorithm infix2postfix (cont.) 2.3 elseif (character = ‘*’, ‘/’, ‘+’, ‘-’, ‘^’) 2.3.1 stackTop (s, toptoken) 2.3.2 loop (not emptyStack (s) and priority(character) <= priority(toptoken)) 1. popStack (s, tokenout) 2. print tokenout 3. stackTop (s, toptoken) 2.3.3 pushStack (s, character) 2.4 else 2.4.1 print character
Infix to Postfix Transformation Algorithm infix2postfix (cont.) 3. Loop (not emptyStack (s)) 3.1 popStack (s, character) 3.2 print character 4. end
Infix to Postfix Transformation Infix : A + B * C Postfix : A B C * + A B C * +
Infix to Postfix Transformation Infix : A + B * C - D / E Postfix : A B C * + D E / - - D E / A B C + * * / + -
Algorithm Postfix Evaluation 1. createStack (s) 2. Loop (for each character) 2.1 if character is operand 2.1.1 pushStack (s, character) 2.2 else 2.2.1 popStack (s, oper2) 2.2.2 popStack (s, oper1) 2.2.3 operator character 2.2.4 value calculate (oper1, operator, oper2) 2.2.5 pushStack (s, value) 3. popStack (s, result) 4. end
Postfix Evaluation A B C + * 2 4 6 + * + 10 20 * 6 4 2
Exercise Convert Infix to Postfix 1. A+B*C-D+E 2. (A+B)*C-(D+E) 3. A*(B-C)/D+E*F 4. 3*(1+7)/2
จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์