STACK สแตก(stack) เป็นโครงสร้างข้อมูลแบบเชิงเส้น ที่มีการใส่ข้อมูลเข้า และนำข้อมูลออกเพียงด้านเดียว ดังนั้น ข้อมูลที่เข้าไปอยู่ใน stack ก่อนจะออกจาก stack หลังข้อมูลที่เข้าไปใน stack ทีหลัง นั่นคือ การ "เข้าทีหลังแต่ออกก่อน" (Last In First Out : LIFO)
STACK การกระทำ(Operation) ที่เกี่ยวข้องกับโครงสร้างข้อมูลแบบ Stackประกอบด้วย การสร้าง stack (CREATE) การนำสมาชิกลง stack (PUSH) การนำสมาชิกออกจาก stack (POP) การทดสอบว่า stack ว่างหรือไม่(EMPTY) การทดสอบว่า stack เต็มหรือไม่(FULL) การทำให้ stack เป็น stack ว่าง(CLEAR)
STACK การสร้าง stack ด้วย Array การสร้าง stack ด้วย Link List หมายถึง การแทนที่ข้อมูลของ stack ด้วย array ซึ่ง เป็นการจัดสรรเนื้อที่หน่วยความจำแบบ static นั่นคือ มีการกำหนดขนาดของ stack ล่วงหน้าว่ามีขนาดเท่าใด และจะมีการจัดสรรเนื้อที่หน่วยความจำให้เลย การสร้าง stack ด้วย Link List หมายถึง การแทนที่ข้อมูลของ stack ด้วย Link list ซึ่งเป็นการจัดสรรเนื้อที่หน่วยความจำแบบ Dynamic นั่นคือ หน่วยความจำจะถูกจัดสรรเมื่อมีการของใช้จริงๆ ระหว่างการประมวลผลโปรแกรมผ่านตัวแปรชนิด Pointer
STACK Algorithm Push(STACK,TOP,MAXSTK,ITEM) If TOP = MAXSTK Then Print “OVERFLOW” and Return else set TOP = TOP+1 set STACK[TOP]=ITEM Return
STACK การนำข้อมูลออกจาก Stack
STACK การนำข้อมูลออกจาก Stack Algorithm POP(STACK,TOP,ITEM) If TOP = 0 Then Print “UNDERFLOW” and Return else set ITEM = STACK[TOP] set TOP = TOP-1 Return
STACK การประยุกต์ใช้ stack โครงสร้างข้อมูลแบบ stack มีการประยุกต์ใช้มากในการเขียนโปรแกรมของสาขาวิทยาการคอมพิวเตอร์ เช่น การจัดสรรหน่วยความจำในการประมวลผลโปรแกรม, การตรวจสอบอักขระสมดุล(Balancing Symbol) และการคำนวณค่านิพจน์เลขคณิตศาสตร์(Polish notation) เป็นต้น
STACK การประยุกต์ในการออกแบบตัวแปลชุดคำสั่ง(An application in compiler design) ตัวอย่าง PROGRAM MAIN ...... CALL Sub1 PRINT Q .... END MAIN PROCEDURE Sub1 CALL Sub2 A:=A+B ... END Sub1 PROCEDURE Sub2 END Sub2
STACK การตรวจสอบอักขระสมดุล(Balancing Symbol) 1. ให้อ่านอักขระทีละตัว - ถ้าอักขระเป็นอักขระเปิด เช่น {,(,[ เป็นต้น ให้ PUSH ลง stack - ถ้าอักขระเป็นอักขระปิด เช่น },),] เป็นต้น ให้ตรวจ สอบว่าอักขระบน TOP ของ stack เป็นอักขระเปิดที่ คู่กันหรือไม่ - ถ้าใช่ ให้ POP อักขระนั้นออกจาก stack - ถ้าไม่ใช่ ให้แสดงผล error 2.เมื่ออ่านอักขระหมดแล้ว แต่ stack ไม่เป็น stack ว่าง ให้ แสดงผล error
STACK โพลิช โนเตชัน(Polish Notation) เป็นวิธีการจัดรูปแบบของสมการใหม่ โดยให้เครื่องหมายอยู่หน้าตัวดำเนินการ เช่น 2*3 เขียนเป็น *23 เป็นต้น ในกรณีเครื่องหมายหลายตัว เช่น (5+2)*3 = (+52)*3 = *(+52)3 = *+523 เป็นต้น รูปแบบการเขียนสมการ โพลิช โนเตชัน หรือ Prefix Infix: การเขียนสมการโดยให้เครื่องหมายอยู่ระหว่างตัวดำเนินการ เช่น (10/2-2)*2+2 Postfix: การเขียนสมการโดยให้เครื่องหมายอยู่หลังตัวดำเนินการ เช่น 10 , 2 , / , 2 , - , 2 , * , 2 , +
STACK Algorithm การเปลี่ยน Infix เป็น Postfix ให้ EXP เป็นสมการคณิตศาสตร์ที่เป็น Infix Stack เป็น stack ใดๆ และ NEXP เป็นสมการที่เป็น Postfix 1. ใส่ “(“ เข้าไปใน Stack 2. อ่าน EXP จากซ้ายไปขวา 2.1 ถ้าพบตัวถูกดำเนินการ(ตัวเลข) ให้ใส่เข้าไปใน NEXP 2.2 ถ้าพบ “(“ ให้ push ใส่ stack 2.3 ถ้าพบตัวดำเนินการ(เครื่องหมาย) ให้ทำดังนี้ - ให้ pop ตัวดำเนินการ ทุกตัวที่มีลำดับความสำคัญกว่าตัวดำเนินการที่ พบใน 2.3 ออกมาใส่ใน NEXP ให้หมด - นำตัวดำเนินการที่พบใน 2.3 push เข้าใน stack แทนที่ 2.4 ถ้าพบ “)” ให้ทำดังนี้ - ให้ push ตัวดำเนินการ ทุกตัวมาใส่ไว้ใน NEXP ให้หมดจนพบ “(“ - push “(“ ทิ้ง 3. จบการทำงาน
STACK ตัวอย่าง ลำดับที่ EXP Stack NEXP 1 (10/2-2)*2+2) ( 2 (( 3 /2-2)*2+2) 10 4 2-2)*2+2) ((/ 5 -2)*2+2) 10,2 6 2)*2+2) ((- 10,2,/ 7 )*2+2) 10,2,/,2 8 *2+2) 10,2,/,2,- 9 2+2) (* +2) 10,2,/,2,-,2 11 2) (+ 10,2,/,2,-,2,* 12 ) 10,2,/,2,-,2,*,2 13 10,2,/,2,-,2,*,2,+ ตัวอย่าง
STACK โพลิช โนเตชัน(Polish Notation) วิธีการเปลี่ยน Infix เป็น Postfix 1. Completely parnthesize th infix notation to specify the order of all operations 2. Move each operator to the space held by its corressponding right parenthesis 3. Remove all parenthesis ตัวอย่าง A/B^C+D*E-A*C ผลลัพธ์ข้อ 1--> (((A/(B^C))+(D*E))-(A*C)) ผลลัพธ์ข้อ 2--> (((A(BC)^)/(DE)*)+(AC)*) - ผลลัพธ์ข้อ 3--> ABC^/DE*+AC*-
STACK โพลิช โนเตชัน(Polish Notation) Algorithm การคำนวณแบบ Postfix ให้อ่านข้อมูลจากซ้ายไปขวาทีละตัว ถ้าพบตัวถูกดำเนินการ(ตัวเลข) ให้ push stack ถ้าพบตัวดำเนินการ(เครื่องหมาย) ให้ pop item บนสุดของ stack 2 ตัว แล้วทำการคำนวณตามเครื่องหมายที่พบ แล้วนำผลลัพธ์ที่ได้ push stack ทำซ้ำจนกระทั่งหมดข้อมูล
STACK ตัวอย่าง โพลิช โนเตชัน(Polish Notation) สมการ Stack การทำงาน 10,2,/,2,-,2,*,2,+ 10 Push 10 2,/,2,-,2,*,2,+ 10 2 Push 2 /,2,-,2,*,2,+ 5 10/2 2,-,2,*,2,+ 5 2 -,2,*,2,+ 3 5-2 2,*,2,+ 3 2 *,2,+ 6 3*2 2,+ 6 2 + 8 6+2
STACK วิธีคำนวณแบบที่ 2 10, 2, /, 2, -, 2, *, 2, + 5 3 6 8
แบบฝึกหัด แปลงนิพจน์ต่อไปนี้ให้เป็นนิพจน์ Postfix A+B-C*E/(A+B) (A+B)*(C-D)-E*F (A+B)*(C*(D-E)+F)-G A+((B-C)*(D-E)+F)/G-H-J A*(B+D)/A-F-E*(G+H/K)