บทที่ 4 สแตกและคิว (stack & queue)

45
บบบบบ 4 บบบบบบบบบบ (Stack & Queue)

Upload: tallys

Post on 14-Jan-2016

61 views

Category:

Documents


5 download

DESCRIPTION

บทที่ 4 สแตกและคิว (Stack & Queue). FIFO และ LIFO. F irst I n F isrt O ut : FIFO หมายถึงข้อมูลที่ เข้ามา ในลิสต์ ก่อน จะถูก นำออก จากลิสต์เป็น ลำดับแรก ตัวอย่างได้แก่การยืนรอคิวเพื่อซื้อตั๋ว - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: บทที่  4 สแตกและคิว  (Stack & Queue)

บทท�� 4สแตกและคิ ว (Stack & Queue)

Page 2: บทที่  4 สแตกและคิว  (Stack & Queue)

FIFO และ LIFO

First In Fisrt Out : FIFO หมายถึ�งข้อม�ลที่��เข้�ามาในล�สต์�ก�อน จะถึ�กน�าออกจากล�สต์�เป็�นล�าดั�บแรก ต์�วอย�างได้แก�การย$นรอคิ�วเพื่$�อซื้$(อต์�)ว

Last In First Out : LIFO หมายถึ�งข้อม�ลที่��เข้�ามาในล�สต์�เป็�นล�าดั�บส�ดัท�าย จะถึ�กน�าออกจากล�สต์�เป็�นอ�นดั�บแรก ต์�วอย�างได้แก�การน*าชั้�(นข้องป็,� นโต์เข้าและออกจากเถึาป็,� นโต์

Page 3: บทที่  4 สแตกและคิว  (Stack & Queue)

สแต์ก(stack)เป็�นโคิรงสรางข้อม�ลแบบเชั้�งเสน ท��ม�การ

ใส�ข้�อม�ลเข้�า และน�าข้�อม�ลออกเพี�ยงดั�านเดั�ยว ด้�งน�(น ข้อม�ลที่��เข้าไป็อย��ใน stack ก�อนจะออกจาก stack หล�งข้อม�ลที่��เข้าไป็ใน stack ที่�หล�ง น��นคิ$อ การ "เข้�าท�หล�งแต�ออกก�อน " (Last In First Out : LIFO)

Page 4: บทที่  4 สแตกและคิว  (Stack & Queue)

การกระท�า(Operation) ท��เก��ยวข้�องก�บโคิรงสร�างข้�อม�ลแบบ Stackป็ฏิ�บ�ต์�การพื่$(นฐานข้องสแต์กได้แก� push คิ#อการน�า

ข้�อม�ลเก$บในสแตก และ pop คิ#อการน�าข้�อม�ลออกจากสแตก ซื้��งที่�(งสองกระบวนการ จะกระที่*าที่��ส�วนบนส1ด้ข้องสแต์กเสมอ โด้ยป็กต์�แลวม�กก*าหนด้ใหม�ต�วชี้�'ส�วนบนส�ดัข้องสแตก เร�ยกว�า top ส�วนป็ฏิ�บ�ต์�การอ$�น ๆ เป็�นป็ฏิ�บ�ต์�การที่��เก��ยวเน$�องก�บการ push และ pop ม�ด้�งน�(

การสร�างสแตก (CREATE)การที่ด้สอบว�า stack ว�างหร#อไม�(EMPTY)การที่ด้สอบว�า stack เต$มหร#อไม�(FULL)การท�าให� stack เป็*น stack ว�าง(CLEAR)

Page 5: บทที่  4 สแตกและคิว  (Stack & Queue)

การน�าข้�อม�ลเข้�าส��สแตก (Push) กระที่*าที่��ส�วนบนข้องสแต์ก (Top) ซื้��งต�องม�การตรวจสอบก�อนว�าสแตกเต$มหร#อไม�

และการน*าข้อม�ลออกจากสแตก (Pop) กระที่*าที่��ส�วนบนข้องสแต์กเชั้�นก�น โด้ยต์รวจสอบว�าม�สมาชั้�กอย��ในสแต์กหร$อไม� (ตรวจสอบว�าสแตกว�างเป็ล�าหร#อไม� )

Page 6: บทที่  4 สแตกและคิว  (Stack & Queue)

การน*าข้อม�ลเข้าไป็ในกองซื้อน (Push)เป็�นการด้*าเน�นการที่��น*าข้อม�ลเข้าไป็เก3บไว

ด้านบนส1ด้ข้องกองซื้อน (Top of the Stack) เร$�อย ๆ จนกว�ากองซื้อนไม�สามารถึน*าข้อม�ลเข้าไป็เก3บได้

จะเร�ยกว�า กองซื้อนเต์3ม (Stack Full)

Page 7: บทที่  4 สแตกและคิว  (Stack & Queue)

ต์�วอย�างการน*าข้อม�ลเข้า

0

1

2

3

4

Top

90

1. Top = 0

2. Top = Top + 1

3. Stack[Top] = 10154060

Stack

Stack Full

Page 8: บทที่  4 สแตกและคิว  (Stack & Queue)

การน*าข้อม�ลออกจากกองซื้อน (Pop)การท�างานจะตรงข้�ามก�บ Pushจะด้�งเอาข้อม�ลที่��อย��บนส1ด้ออกมาก�อน แต์�ก�อนที่��จะด้�งจะม�

การต์รวจสอบว�ากองซื้อนว�างหร$อไม� ถ้�าว�างจะไม�สามารถ้น�าข้�อม�ลออกไดั� แสด้ง

ว�ากองซื้อนว�าง (Stack Empty)ถึาไม�ว�างจะน*าเอาข้อม�ลออกแลวเล#�อนต�วชี้�'

ไป็ย�งต�าแหน�งถ้�ดัลงไป็

Page 9: บทที่  4 สแตกและคิว  (Stack & Queue)

ต์�วอย�างการน*าข้อม�ลออกTop

2. Top = Top - 1

1. Temp = Stack[Top]

0

1

2

3

4

Stack

Stack Empty

Temp

10

15

40

60

Page 10: บทที่  4 สแตกและคิว  (Stack & Queue)

การสร�าง stack ดั�วย Arrayหมายถึ�ง การแทนท��ข้�อม�ลข้อง stack

ดั�วย array ซื้��ง เป็�นการจ�ดัสรรเน#'อท��หน�วยคิวามจ�าแบบ static น��นคิ$อ

ม�การก�าหนดัข้นาดัข้อง stack ล�วงหน�าว�าม�ข้นาด้เที่�าใด้ และจะม�การจ�ด้สรรเน$(อที่��หน�วยคิวามจ*าใหเลย

Page 11: บทที่  4 สแตกและคิว  (Stack & Queue)

การแที่นที่��โคิรงสรางข้อม�ลแบบกองซื้อนด้วยแถึวล*าด้�บ

แบบล*าด้�บจะต์องม�การจองพื่$(นที่��หน�วยคิวามจ*าไวล�วงหนา ว�าจะม�ข้นาด้เที่�าใด้

โดัยแถ้วล�าดั�บน�'จะป็,ดัป็ลายดั�านหน-�งไว� เพี#�อให�ข้�อม�ลเข้�า-ออกทางเดั�ยว

ป็ฏิ�บ�ต์�การม� 4 ข้�(นต์อนคิ$อการสรางการ Pushการ Popการ แสด้ง

Page 12: บทที่  4 สแตกและคิว  (Stack & Queue)

การสรางกองซื้อนด้วยแถึวล*าด้�บเป็�นการเต์ร�ยมเน$(อที่��ในหน�วยคิวามจ*าไวส*าหร�บเก3บข้อม�ลต์�วอย�างในภาษาซื้� คิ$อ

int Stack[4];

การน*าข้อม�ลเข้าและออกจากหน�วยคิวามจ*าด้วยแถึวล*าด้�บ ก3เหม$อนก�บที่��ยกต์�วอย�างไป็แลว

Stack

Page 13: บทที่  4 สแตกและคิว  (Stack & Queue)

การแสด้งข้อม�ลที่��อย��ในกองซื้อนด้วยแถึวล*าด้�บจะเป็�นการด้�งข้อม�ลต์�(งแต์�ต์*าแหน�งแรกจนถึ�งต์*าแหน�งที่��

Top ชั้�(อย��ออกมาแสด้งหร$อจะกล�บก�นคิ$อ น*าข้อม�ลจากต์*าแหน�ง Top ชั้�(อย��จนถึ�ง

ต์*าแหน�งที่�� 0 ออกมาแสด้ง

Page 14: บทที่  4 สแตกและคิว  (Stack & Queue)

I

0

1

2

3

4

Stack

แสด้งข้อม�ล

10

15

40

60Top

60

40

15

10

Page 15: บทที่  4 สแตกและคิว  (Stack & Queue)

การสร�าง stack ดั�วย Link List หมายถึ�ง การแที่นที่��ข้อม�ลข้อง stack ด้วย Link list ซื้��งเป็�นการจ�ด้สรรเน$(อที่��หน�วยคิวามจ*าแบบ Dynamic น��นคิ$อ หน�วยคิวามจ*าจะถึ�กจ�ด้สรรเม$�อม�การข้องใชั้จร�งๆ ระหว�างการป็ระมวลผลโป็รแกรมผ�านต�วแป็รชี้น ดั Pointer

Page 16: บทที่  4 สแตกและคิว  (Stack & Queue)

การแที่นที่��โคิรงสรางข้อม�ลกองซื้อนด้วยรายการโยงเป็�นการแทนท��ท��ม�คิวามย#ดัหย��นมาก เน$�องจากไม�ต�องก�าหนดัหร#อจองหน�วยคิวามจ�าล�วงหน�าข้อม�ลที่��เก3บในกองซื้อนม�จ*านวนเที่�าใด้ก3ได้ การป็ฏิ�บ�ต์�การม�

4 ข้�(นต์อนคิ$อ การสราง, การ Push, การ Pop และการแสด้ง

Page 17: บทที่  4 สแตกและคิว  (Stack & Queue)

การสรางกองซื้อนด้วยรายการโยงต์�วอย�างกรณี�ที่��เป็�น รายการ

โยงแบบเด้��ยว การสรางจะเป็�นด้�งน�(

typedef struct node

{ int data;

struct node *Next;

} node;

node *Top;

int info;data

node

Next

Page 18: บทที่  4 สแตกและคิว  (Stack & Queue)

การน*าข้อม�ลเข้าไป็ในกองซื้อนแบบรายการโยง

8 0 ^

P

Top

1. Top = Null2. New(P)3. Data(p) = 804. Next(p) = Null5. Top = p

Page 19: บทที่  4 สแตกและคิว  (Stack & Queue)

การน*าข้อม�ลเข้าไป็ในกองซื้อนแบบรายการโยง

เพื่��มข้อม�ล 90 เข้าไป็ในรายการโยง

80 ^

Top

1. New(P)2. Data(P) = 903. Next(P) = Top

4. Top = p

P

90Top

Page 20: บทที่  4 สแตกและคิว  (Stack & Queue)

การน*าข้อม�ลเข้าไป็ในกองซื้อนแบบรายการโยง

80 ^

Top

1. New(P)

2. Data(P) = 120

3. Next(P) = Top

4. Top = p

P

120Top 90

Page 21: บทที่  4 สแตกและคิว  (Stack & Queue)

การน*าข้อม�ลออกจากกองซื้อนด้วยรายการโยง

80 ^

TopTemp

120Top 90

1. Temp=Top 2. Top = Next(Top)

Page 22: บทที่  4 สแตกและคิว  (Stack & Queue)

การน*าข้อม�ลออกจากกองซื้อนด้วยรายการโยง

TopTemp

90Top 80

1. Temp=Top 2. Top = Next(Top)

^

Page 23: บทที่  4 สแตกและคิว  (Stack & Queue)

การน*าข้อม�ลออกจากกองซื้อนด้วยรายการโยง

Top = NULLTemp

80Top

1. Temp=Top 2. Top = Next(Top)

Page 24: บทที่  4 สแตกและคิว  (Stack & Queue)

การน*าข้อม�ลออกจากกองซื้อนด้วยรายการโยง

Top = NULL

1. Temp=Top

Stack Empty

Page 25: บทที่  4 สแตกและคิว  (Stack & Queue)

การแสด้งข้อม�ลที่��อย��ในกองซื้อนด้วยรายการโยง

80 ^

P

120Top 90

P P

120 90 80

Page 26: บทที่  4 สแตกและคิว  (Stack & Queue)

การป็ระย�กต0ใชี้� stack โคิรงสรางข้อม�ลแบบ stack ม�การป็ระย1กต์�ใชั้มาก

ในการเข้�ยนโป็รแกรมข้องสาข้าว�ที่ยาการคิอมพื่�วเต์อร� เชั้�น การจ�ด้สรรหน�วยคิวามจ*าในการป็ระมวลผลโป็รแกรม การต์รวจสอบอ�กข้ระสมด้1ล(Balancing Symbol ) และการคิ*านวณีน�พื่จน�คิณี�ต์ศาสต์ร�

Page 27: บทที่  4 สแตกและคิว  (Stack & Queue)

การเร�ยกใชี้�โป็รแกรมย�อย

การเร�ยกโป็รแกรมย�อยม�คิวามแต์กต์�างก�บการกระโด้ด้ที่��วไป็ เน$�องจากภายหล�งที่��โป็รแกรมย�อยที่*างานเสร3จ หน�วยป็ระมวลผลจะต์องสามารถึกระโด้ด้กล�บมาที่*างานในโป็รแกรมหล�กต์�อไป็ได้   ดั�งน�'นการเร�ยกใชี้�โป็รแกรมย�อยน�'นจะต�องม�การเก$บต�าแหน�งข้องคิ�าส��งท��ท�างานอย��เด้�มด้วย และเม#�อจบโป็รแกรมย�อยโป็รแกรมจะต�องกระโดัดักล�บมาท�างานท��เดั ม โด้ยใชั้ข้อม�ลที่��เก3บไว ภาพื่และอ�ลกอร�ที่�มแสด้งต์�วอย�างการเร�ยกใชั้โป็รแกรมย�อย

Page 28: บทที่  4 สแตกและคิว  (Stack & Queue)

PROGRAM MAIN......CALL Sub1PRINT Q....END MAINPROCEDURE Sub1....CALL Sub2A:=A+B...END Sub1PROCEDURE Sub2...END Sub2

Page 29: บทที่  4 สแตกและคิว  (Stack & Queue)

การป็ระย1กต์�ใชั้โคิรงสรางข้อม�ลแบบกองซื้อนการเร�ยกใชั้โป็รแกรมย�อยอ$�นโป็รแกรมย�อยที่��เร�ยกใชั้ต์�วเอง

Factorialการคิ*านวณีน�พื่จน�ที่างคิณี�ต์ศาสต์ร�

Page 30: บทที่  4 สแตกและคิว  (Stack & Queue)

การเร�ยกใชั้โป็รแกรมอ$�น

Stack

-----Call B-----

Call Cส�(นส1ด้โป็รแกรม

-----Call B1

-----Return

----------

Return

----------

Return1000

1500

B B1

C

1000

1500

Page 31: บทที่  4 สแตกและคิว  (Stack & Queue)

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

Page 32: บทที่  4 สแตกและคิว  (Stack & Queue)

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

Page 33: บทที่  4 สแตกและคิว  (Stack & Queue)

การตรวจสอบอ�กข้ระสมดั�ล(Balancing Symbol)

ในการตรวจสอบอ�กข้ระสมดั�ลน�'น คิอมไพีเลอร0ไดั�น�าแนวคิ ดัโคิรงสร�างข้�อม�ลแบบ Stack มาป็ระย�กต0 โดัยม�ว ธี�การดั�งน�'

1. ให�อ�านอ�กข้ระท�ละต�ว - ถ้�าอ�กข้ระเป็*นอ�กข้ระเป็,ดั เชี้�น {,(,[ เป็*นต�น

ให� PUSH ลง stack - ถ้�าอ�กข้ระเป็*นอ�กข้ระป็,ดั เชี้�น },),] เป็*นต�น

ให�ตรวจสอบว�าอ�กข้ระบน TOP ข้อง stack เป็*นอ�กข้ระเป็,ดัท��คิ��ก�นหร#อไม�

- ถ้�าใชี้� ให� POP อ�กข้ระน�'นออกจาก stack - ถ้�าไม�ใชี้� ให�แสดังผล error 2.เม#�ออ�านอ�กข้ระหมดัแล�ว แต� stack ไม�เป็*น

stack ว�าง ให�แสดังผล error

Page 34: บทที่  4 สแตกและคิว  (Stack & Queue)

โพีล ชี้ โนเตชี้�น(Polish Notation)

เป็�นว�ธี�การจ�ด้ร�ป็แบบข้องสมการใหม� โดัยการย�ายต�าแหน�งข้องเคิร#�องหมายและต�วดั�าเน นการ เชี้�น 2*3 เข้�ยนเป็*น *23 เป็�นต์น โด้ยม�ร�ป็แบบการเข้�ยนสมการ ด้�งน�(

Prefix : การเข้�ยนสมการโด้ยใหเคิร$�องหมายอย��หนาต์�วด้*าเน�นการ

เชั้�น * + 5 3 2Infix : การเข้�ยนสมการโด้ยใหเคิร$�องหมายอย��ระหว�างต์�วด้*าเน�น

การ เชั้�น (5+3)*2Postfix : การเข้�ยนสมการโด้ยใหเคิร$�องหมายอย��หล�งต์�วด้*าเน�น

การ เชั้�น 5 3 + 2 *

Page 35: บทที่  4 สแตกและคิว  (Stack & Queue)

Algorithm การคิ�านวณแบบ Postfix

ใหอ�านข้อม�ลจากซื้ายไป็ข้วาที่�ละต์�วถึาพื่บต์�วถึ�กด้*าเน�นการ(ต์�วเลข้ ) ให push stackถึาพื่บต�วดั�าเน นการ(เคิร#�องหมาย ) ให� pop item บน

ส�ดัข้อง stack 2 ต�ว แลวที่*าการคิ*านวณีต์ามเคิร$�องหมายที่��พื่บ แลวน*าผลล�พื่ธี�ที่��ได้ push stack

ท�าซ้ำ�'าจนกระท��งหมดัข้�อม�ล

Page 36: บทที่  4 สแตกและคิว  (Stack & Queue)

Algorithm การคิ�านวณแบบ Postfix

Page 37: บทที่  4 สแตกและคิว  (Stack & Queue)

ว ธี�การเป็ล��ยน Infix เป็*น PostfixAlgorithm การเป็ล��ยน Infix เป็*น Postfix ให EXP เป็�นสมการคิณี�ต์ศาสต์ร�ที่��เป็�น Infix และ

Stack เป็�น stack ใด้ ๆ NEXP เป็�นสมการที่��เป็�น Postfix

1. ใส� “(“ เข้าไป็ใน Stack 2. อ�าน EXP จากซื้ายไป็ข้วา 21. ถึาพื่บต์�วถึ�กด้*าเน�นการ(ต์�วเลข้ ) ใหใส�เข้าไป็

ใน NEXP 2.2 ถึาพื่บ “(“ ให push ใส� stack

Page 38: บทที่  4 สแตกและคิว  (Stack & Queue)

ว ธี�การเป็ล��ยน Infix เป็*น Postfix2.3 ถึาพื่บต์�วด้*าเน�นการ(เคิร$�องหมาย ) ใหที่*าด้�งน�( - ให pop ต์�วด้*าเน�นการ ที่1กต์�วที่��ม�ล*าด้�บคิวาม

ส*าคิ�ญกว�าต์�วด้*าเน�นการที่��พื่บใน 23 ออกมาใส�ใน NEXP ใหหมด้

- น*าต์�วด้*าเน�นการที่��พื่บใน 23. push เข้าใน stack แที่นที่��

24. ถึาพื่บ “)” ใหที่*าด้�งน�( - ให push ต์�วด้*าเน�นการ ที่1กต์�วมาใส�ไวใน

NEXP ใหหมด้จนพื่บ “(“ - push “(“ ที่�(ง 3. จบการที่*างาน

Page 39: บทที่  4 สแตกและคิว  (Stack & Queue)

คิวามส*าคิ�ญข้องต์�วด้*าเน�นการ

เคิร#�องหมาย คิวามส�าคิ�ญเม#�ออย��ในStack

คิวามส�าคิ�ญเม#�ออย��ท��อ นพี�ต

** (ยกก*าล�ง) 3 4

* , / 2 2

+ , - 1 1

( 0 3

Page 40: บทที่  4 สแตกและคิว  (Stack & Queue)

A + B

เคิร$�องหมาย

Stack น�พื่จน� Postfix

A

+

B

ว�าง+

+

A

A

AB

AB+

Page 41: บทที่  4 สแตกและคิว  (Stack & Queue)

A + B * C

เคิร$�องหมาย Stack น�พื่จน� Postfix

A

+

B

*

C

ว�าง+

+

+ , *

+ , *

A

A

AB

AB

ABC

ABC*+

Page 42: บทที่  4 สแตกและคิว  (Stack & Queue)

(A + B) * C

เคิร$�องหมาย Stack น�พื่จน� Postfix

(

A

+

B

)

*

C

(

(

(+

(+

ว�าง *

*

ว�างA

A

AB

AB+

AB+

AB+C

AB+C*

Page 43: บทที่  4 สแตกและคิว  (Stack & Queue)

((10/2-2)*2+2)

Page 44: บทที่  4 สแตกและคิว  (Stack & Queue)

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 / -

Page 45: บทที่  4 สแตกและคิว  (Stack & Queue)

ลองท�าดั�จงเป็ล��ยนน�พื่จน�อ�นฟ,กซื้� ต์�อไป็น�(ใหเป็�นโพื่สฟ,กซื้�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