บทท�� 4สแตกและคิ ว (Stack & Queue)
FIFO และ LIFO
First In Fisrt Out : FIFO หมายถึ�งข้อม�ลที่��เข้�ามาในล�สต์�ก�อน จะถึ�กน�าออกจากล�สต์�เป็�นล�าดั�บแรก ต์�วอย�างได้แก�การย$นรอคิ�วเพื่$�อซื้$(อต์�)ว
Last In First Out : LIFO หมายถึ�งข้อม�ลที่��เข้�ามาในล�สต์�เป็�นล�าดั�บส�ดัท�าย จะถึ�กน�าออกจากล�สต์�เป็�นอ�นดั�บแรก ต์�วอย�างได้แก�การน*าชั้�(นข้องป็,� นโต์เข้าและออกจากเถึาป็,� นโต์
สแต์ก(stack)เป็�นโคิรงสรางข้อม�ลแบบเชั้�งเสน ท��ม�การ
ใส�ข้�อม�ลเข้�า และน�าข้�อม�ลออกเพี�ยงดั�านเดั�ยว ด้�งน�(น ข้อม�ลที่��เข้าไป็อย��ใน stack ก�อนจะออกจาก stack หล�งข้อม�ลที่��เข้าไป็ใน stack ที่�หล�ง น��นคิ$อ การ "เข้�าท�หล�งแต�ออกก�อน " (Last In First Out : LIFO)
การกระท�า(Operation) ท��เก��ยวข้�องก�บโคิรงสร�างข้�อม�ลแบบ Stackป็ฏิ�บ�ต์�การพื่$(นฐานข้องสแต์กได้แก� push คิ#อการน�า
ข้�อม�ลเก$บในสแตก และ pop คิ#อการน�าข้�อม�ลออกจากสแตก ซื้��งที่�(งสองกระบวนการ จะกระที่*าที่��ส�วนบนส1ด้ข้องสแต์กเสมอ โด้ยป็กต์�แลวม�กก*าหนด้ใหม�ต�วชี้�'ส�วนบนส�ดัข้องสแตก เร�ยกว�า top ส�วนป็ฏิ�บ�ต์�การอ$�น ๆ เป็�นป็ฏิ�บ�ต์�การที่��เก��ยวเน$�องก�บการ push และ pop ม�ด้�งน�(
การสร�างสแตก (CREATE)การที่ด้สอบว�า stack ว�างหร#อไม�(EMPTY)การที่ด้สอบว�า stack เต$มหร#อไม�(FULL)การท�าให� stack เป็*น stack ว�าง(CLEAR)
การน�าข้�อม�ลเข้�าส��สแตก (Push) กระที่*าที่��ส�วนบนข้องสแต์ก (Top) ซื้��งต�องม�การตรวจสอบก�อนว�าสแตกเต$มหร#อไม�
และการน*าข้อม�ลออกจากสแตก (Pop) กระที่*าที่��ส�วนบนข้องสแต์กเชั้�นก�น โด้ยต์รวจสอบว�าม�สมาชั้�กอย��ในสแต์กหร$อไม� (ตรวจสอบว�าสแตกว�างเป็ล�าหร#อไม� )
การน*าข้อม�ลเข้าไป็ในกองซื้อน (Push)เป็�นการด้*าเน�นการที่��น*าข้อม�ลเข้าไป็เก3บไว
ด้านบนส1ด้ข้องกองซื้อน (Top of the Stack) เร$�อย ๆ จนกว�ากองซื้อนไม�สามารถึน*าข้อม�ลเข้าไป็เก3บได้
จะเร�ยกว�า กองซื้อนเต์3ม (Stack Full)
ต์�วอย�างการน*าข้อม�ลเข้า
0
1
2
3
4
Top
90
1. Top = 0
2. Top = Top + 1
3. Stack[Top] = 10154060
Stack
Stack Full
การน*าข้อม�ลออกจากกองซื้อน (Pop)การท�างานจะตรงข้�ามก�บ Pushจะด้�งเอาข้อม�ลที่��อย��บนส1ด้ออกมาก�อน แต์�ก�อนที่��จะด้�งจะม�
การต์รวจสอบว�ากองซื้อนว�างหร$อไม� ถ้�าว�างจะไม�สามารถ้น�าข้�อม�ลออกไดั� แสด้ง
ว�ากองซื้อนว�าง (Stack Empty)ถึาไม�ว�างจะน*าเอาข้อม�ลออกแลวเล#�อนต�วชี้�'
ไป็ย�งต�าแหน�งถ้�ดัลงไป็
ต์�วอย�างการน*าข้อม�ลออกTop
2. Top = Top - 1
1. Temp = Stack[Top]
0
1
2
3
4
Stack
Stack Empty
Temp
10
15
40
60
การสร�าง stack ดั�วย Arrayหมายถึ�ง การแทนท��ข้�อม�ลข้อง stack
ดั�วย array ซื้��ง เป็�นการจ�ดัสรรเน#'อท��หน�วยคิวามจ�าแบบ static น��นคิ$อ
ม�การก�าหนดัข้นาดัข้อง stack ล�วงหน�าว�าม�ข้นาด้เที่�าใด้ และจะม�การจ�ด้สรรเน$(อที่��หน�วยคิวามจ*าใหเลย
การแที่นที่��โคิรงสรางข้อม�ลแบบกองซื้อนด้วยแถึวล*าด้�บ
แบบล*าด้�บจะต์องม�การจองพื่$(นที่��หน�วยคิวามจ*าไวล�วงหนา ว�าจะม�ข้นาด้เที่�าใด้
โดัยแถ้วล�าดั�บน�'จะป็,ดัป็ลายดั�านหน-�งไว� เพี#�อให�ข้�อม�ลเข้�า-ออกทางเดั�ยว
ป็ฏิ�บ�ต์�การม� 4 ข้�(นต์อนคิ$อการสรางการ Pushการ Popการ แสด้ง
การสรางกองซื้อนด้วยแถึวล*าด้�บเป็�นการเต์ร�ยมเน$(อที่��ในหน�วยคิวามจ*าไวส*าหร�บเก3บข้อม�ลต์�วอย�างในภาษาซื้� คิ$อ
int Stack[4];
การน*าข้อม�ลเข้าและออกจากหน�วยคิวามจ*าด้วยแถึวล*าด้�บ ก3เหม$อนก�บที่��ยกต์�วอย�างไป็แลว
Stack
การแสด้งข้อม�ลที่��อย��ในกองซื้อนด้วยแถึวล*าด้�บจะเป็�นการด้�งข้อม�ลต์�(งแต์�ต์*าแหน�งแรกจนถึ�งต์*าแหน�งที่��
Top ชั้�(อย��ออกมาแสด้งหร$อจะกล�บก�นคิ$อ น*าข้อม�ลจากต์*าแหน�ง Top ชั้�(อย��จนถึ�ง
ต์*าแหน�งที่�� 0 ออกมาแสด้ง
I
0
1
2
3
4
Stack
แสด้งข้อม�ล
10
15
40
60Top
60
40
15
10
การสร�าง stack ดั�วย Link List หมายถึ�ง การแที่นที่��ข้อม�ลข้อง stack ด้วย Link list ซื้��งเป็�นการจ�ด้สรรเน$(อที่��หน�วยคิวามจ*าแบบ Dynamic น��นคิ$อ หน�วยคิวามจ*าจะถึ�กจ�ด้สรรเม$�อม�การข้องใชั้จร�งๆ ระหว�างการป็ระมวลผลโป็รแกรมผ�านต�วแป็รชี้น ดั Pointer
การแที่นที่��โคิรงสรางข้อม�ลกองซื้อนด้วยรายการโยงเป็�นการแทนท��ท��ม�คิวามย#ดัหย��นมาก เน$�องจากไม�ต�องก�าหนดัหร#อจองหน�วยคิวามจ�าล�วงหน�าข้อม�ลที่��เก3บในกองซื้อนม�จ*านวนเที่�าใด้ก3ได้ การป็ฏิ�บ�ต์�การม�
4 ข้�(นต์อนคิ$อ การสราง, การ Push, การ Pop และการแสด้ง
การสรางกองซื้อนด้วยรายการโยงต์�วอย�างกรณี�ที่��เป็�น รายการ
โยงแบบเด้��ยว การสรางจะเป็�นด้�งน�(
typedef struct node
{ int data;
struct node *Next;
} node;
node *Top;
int info;data
node
Next
การน*าข้อม�ลเข้าไป็ในกองซื้อนแบบรายการโยง
8 0 ^
P
Top
1. Top = Null2. New(P)3. Data(p) = 804. Next(p) = Null5. Top = p
การน*าข้อม�ลเข้าไป็ในกองซื้อนแบบรายการโยง
เพื่��มข้อม�ล 90 เข้าไป็ในรายการโยง
80 ^
Top
1. New(P)2. Data(P) = 903. Next(P) = Top
4. Top = p
P
90Top
การน*าข้อม�ลเข้าไป็ในกองซื้อนแบบรายการโยง
80 ^
Top
1. New(P)
2. Data(P) = 120
3. Next(P) = Top
4. Top = p
P
120Top 90
การน*าข้อม�ลออกจากกองซื้อนด้วยรายการโยง
80 ^
TopTemp
120Top 90
1. Temp=Top 2. Top = Next(Top)
การน*าข้อม�ลออกจากกองซื้อนด้วยรายการโยง
TopTemp
90Top 80
1. Temp=Top 2. Top = Next(Top)
^
การน*าข้อม�ลออกจากกองซื้อนด้วยรายการโยง
Top = NULLTemp
80Top
1. Temp=Top 2. Top = Next(Top)
การน*าข้อม�ลออกจากกองซื้อนด้วยรายการโยง
Top = NULL
1. Temp=Top
Stack Empty
การแสด้งข้อม�ลที่��อย��ในกองซื้อนด้วยรายการโยง
80 ^
P
120Top 90
P P
120 90 80
การป็ระย�กต0ใชี้� stack โคิรงสรางข้อม�ลแบบ stack ม�การป็ระย1กต์�ใชั้มาก
ในการเข้�ยนโป็รแกรมข้องสาข้าว�ที่ยาการคิอมพื่�วเต์อร� เชั้�น การจ�ด้สรรหน�วยคิวามจ*าในการป็ระมวลผลโป็รแกรม การต์รวจสอบอ�กข้ระสมด้1ล(Balancing Symbol ) และการคิ*านวณีน�พื่จน�คิณี�ต์ศาสต์ร�
การเร�ยกใชี้�โป็รแกรมย�อย
การเร�ยกโป็รแกรมย�อยม�คิวามแต์กต์�างก�บการกระโด้ด้ที่��วไป็ เน$�องจากภายหล�งที่��โป็รแกรมย�อยที่*างานเสร3จ หน�วยป็ระมวลผลจะต์องสามารถึกระโด้ด้กล�บมาที่*างานในโป็รแกรมหล�กต์�อไป็ได้ ดั�งน�'นการเร�ยกใชี้�โป็รแกรมย�อยน�'นจะต�องม�การเก$บต�าแหน�งข้องคิ�าส��งท��ท�างานอย��เด้�มด้วย และเม#�อจบโป็รแกรมย�อยโป็รแกรมจะต�องกระโดัดักล�บมาท�างานท��เดั ม โด้ยใชั้ข้อม�ลที่��เก3บไว ภาพื่และอ�ลกอร�ที่�มแสด้งต์�วอย�างการเร�ยกใชั้โป็รแกรมย�อย
PROGRAM MAIN......CALL Sub1PRINT Q....END MAINPROCEDURE Sub1....CALL Sub2A:=A+B...END Sub1PROCEDURE Sub2...END Sub2
การป็ระย1กต์�ใชั้โคิรงสรางข้อม�ลแบบกองซื้อนการเร�ยกใชั้โป็รแกรมย�อยอ$�นโป็รแกรมย�อยที่��เร�ยกใชั้ต์�วเอง
Factorialการคิ*านวณีน�พื่จน�ที่างคิณี�ต์ศาสต์ร�
การเร�ยกใชั้โป็รแกรมอ$�น
Stack
-----Call B-----
Call Cส�(นส1ด้โป็รแกรม
-----Call B1
-----Return
----------
Return
----------
Return1000
1500
B B1
C
1000
1500
Factorialส�ญล�กษณี�แฟกต์อเร�ยลเข้�ยนเป็�น n!
0! = 11! = 12! = 2 x 13! = 3 x 2 x 1n! = n x (n-1) x (n-2) x …x 2 x 1
3!
0
1
2
3
4
Top3
2
1
Stack
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1
Push
Pop
1! = 1 * 1
2! = 2 * 1
3! = 3 * 2
การตรวจสอบอ�กข้ระสมดั�ล(Balancing Symbol)
ในการตรวจสอบอ�กข้ระสมดั�ลน�'น คิอมไพีเลอร0ไดั�น�าแนวคิ ดัโคิรงสร�างข้�อม�ลแบบ Stack มาป็ระย�กต0 โดัยม�ว ธี�การดั�งน�'
1. ให�อ�านอ�กข้ระท�ละต�ว - ถ้�าอ�กข้ระเป็*นอ�กข้ระเป็,ดั เชี้�น {,(,[ เป็*นต�น
ให� PUSH ลง stack - ถ้�าอ�กข้ระเป็*นอ�กข้ระป็,ดั เชี้�น },),] เป็*นต�น
ให�ตรวจสอบว�าอ�กข้ระบน TOP ข้อง stack เป็*นอ�กข้ระเป็,ดัท��คิ��ก�นหร#อไม�
- ถ้�าใชี้� ให� POP อ�กข้ระน�'นออกจาก stack - ถ้�าไม�ใชี้� ให�แสดังผล error 2.เม#�ออ�านอ�กข้ระหมดัแล�ว แต� stack ไม�เป็*น
stack ว�าง ให�แสดังผล error
โพีล ชี้ โนเตชี้�น(Polish Notation)
เป็�นว�ธี�การจ�ด้ร�ป็แบบข้องสมการใหม� โดัยการย�ายต�าแหน�งข้องเคิร#�องหมายและต�วดั�าเน นการ เชี้�น 2*3 เข้�ยนเป็*น *23 เป็�นต์น โด้ยม�ร�ป็แบบการเข้�ยนสมการ ด้�งน�(
Prefix : การเข้�ยนสมการโด้ยใหเคิร$�องหมายอย��หนาต์�วด้*าเน�นการ
เชั้�น * + 5 3 2Infix : การเข้�ยนสมการโด้ยใหเคิร$�องหมายอย��ระหว�างต์�วด้*าเน�น
การ เชั้�น (5+3)*2Postfix : การเข้�ยนสมการโด้ยใหเคิร$�องหมายอย��หล�งต์�วด้*าเน�น
การ เชั้�น 5 3 + 2 *
Algorithm การคิ�านวณแบบ Postfix
ใหอ�านข้อม�ลจากซื้ายไป็ข้วาที่�ละต์�วถึาพื่บต์�วถึ�กด้*าเน�นการ(ต์�วเลข้ ) ให push stackถึาพื่บต�วดั�าเน นการ(เคิร#�องหมาย ) ให� pop item บน
ส�ดัข้อง stack 2 ต�ว แลวที่*าการคิ*านวณีต์ามเคิร$�องหมายที่��พื่บ แลวน*าผลล�พื่ธี�ที่��ได้ push stack
ท�าซ้ำ�'าจนกระท��งหมดัข้�อม�ล
Algorithm การคิ�านวณแบบ Postfix
ว ธี�การเป็ล��ยน Infix เป็*น PostfixAlgorithm การเป็ล��ยน Infix เป็*น Postfix ให EXP เป็�นสมการคิณี�ต์ศาสต์ร�ที่��เป็�น Infix และ
Stack เป็�น stack ใด้ ๆ NEXP เป็�นสมการที่��เป็�น Postfix
1. ใส� “(“ เข้าไป็ใน Stack 2. อ�าน EXP จากซื้ายไป็ข้วา 21. ถึาพื่บต์�วถึ�กด้*าเน�นการ(ต์�วเลข้ ) ใหใส�เข้าไป็
ใน NEXP 2.2 ถึาพื่บ “(“ ให push ใส� stack
ว ธี�การเป็ล��ยน Infix เป็*น Postfix2.3 ถึาพื่บต์�วด้*าเน�นการ(เคิร$�องหมาย ) ใหที่*าด้�งน�( - ให pop ต์�วด้*าเน�นการ ที่1กต์�วที่��ม�ล*าด้�บคิวาม
ส*าคิ�ญกว�าต์�วด้*าเน�นการที่��พื่บใน 23 ออกมาใส�ใน NEXP ใหหมด้
- น*าต์�วด้*าเน�นการที่��พื่บใน 23. push เข้าใน stack แที่นที่��
24. ถึาพื่บ “)” ใหที่*าด้�งน�( - ให push ต์�วด้*าเน�นการ ที่1กต์�วมาใส�ไวใน
NEXP ใหหมด้จนพื่บ “(“ - push “(“ ที่�(ง 3. จบการที่*างาน
คิวามส*าคิ�ญข้องต์�วด้*าเน�นการ
เคิร#�องหมาย คิวามส�าคิ�ญเม#�ออย��ในStack
คิวามส�าคิ�ญเม#�ออย��ท��อ นพี�ต
** (ยกก*าล�ง) 3 4
* , / 2 2
+ , - 1 1
( 0 3
A + B
เคิร$�องหมาย
Stack น�พื่จน� Postfix
A
+
B
ว�าง+
+
A
A
AB
AB+
A + B * C
เคิร$�องหมาย Stack น�พื่จน� Postfix
A
+
B
*
C
ว�าง+
+
+ , *
+ , *
A
A
AB
AB
ABC
ABC*+
(A + B) * C
เคิร$�องหมาย Stack น�พื่จน� Postfix
(
A
+
B
)
*
C
(
(
(+
(+
ว�าง *
*
ว�างA
A
AB
AB+
AB+
AB+C
AB+C*
((10/2-2)*2+2)
8*(4+3)-9/6เคิร$�องหมาย Stack น�พื่จน� Postfix
8
*
(
4
+
3
)
-
9
/
6
ว�าง
ว�าง*
*(
*(
*(+
*(+
*
-
-
- /
- /
8
8
8
8 4
8 4
8 4 3
8 4 3 +
8 4 3 + *
8 4 3 + * 9
8 4 3 + * 9
8 4 3 + * 9 6
8 4 3 + * 9 6 / -
ลองท�าดั�จงเป็ล��ยนน�พื่จน�อ�นฟ,กซื้� ต์�อไป็น�(ใหเป็�นโพื่สฟ,กซื้�1. ((A+B)*C)-D2. A*C/D3. 10+15*20/64. 5*4+(8/2)5. 10/(2+3)+(5+6)*96. A*(B-C/D)+E
Top Related