สแตกและคิว (stack & queue)

45
Week 7 สแตกและคิว (Stack & Queue)

Upload: tumetr

Post on 15-Jul-2015

421 views

Category:

Education


6 download

TRANSCRIPT

Page 1: สแตกและคิว (Stack & queue)

Week 7 สแตกและคิว (Stack & Queue)

Page 2: สแตกและคิว (Stack & queue)

FIFO และ LIFO

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

Last In First Out : LIFO หมายถงึข้อมูลที่เข ้ามาในลสิต์เป็นล ำาด ับส ุดท ้าย จะถกูน ำาออกจากลสิต์เป็นอ ันด ับแรก เช่น การนำาชัน้ของปิ่นโตเข้าและออกจากเถาปิ่นโต

Page 3: สแตกและคิว (Stack & queue)

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

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

Page 4: สแตกและคิว (Stack & queue)

การกระทำา(Operation) ที่เก ี่ยวข ้อง กับโครงสร ้างข ้อมลูแบบ Stack

ปฏิบัติการพื้นฐานของสแตกได้แก ่push คือการนำาข ้อม ูลเกบ็ในสแตก และ pop คือการนำาข ้อม ูลออกจากสแตก ซึ่งทั้งสองกระบวนการ จะกระทำาที่ส่วนบนสุดของสแตกเสมอ โดยปกติแล้วมักกำาหนดให้มีต ัวช ี้

ส่วนบนสุดของสแตก เร ียกว ่า top ส่วนปฏิบัติการอื่น ๆ เป็นปฏิบัติการที่เกี่ยวเน่ืองกบัการ push และ pop มีดังน้ี

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

Page 5: สแตกและคิว (Stack & queue)

การนำาข ้อม ูลเข ้าส ู่สแตก (Push) กระทำาที่ส่วนบนของสแตก (Top) ซึ่งต ้องม ีการตรวจสอบกอ่นว ่าสแตกเต ็มหร ือไม ่

และการนำาข้อมูล ออกจากสแตก (Pop) กระทำาที่ส่วนบนของสแตกเช่นกัน โดยตรวจสอบว่ามีสมาชิกอยู่ในสแตกหรือไม่ (ตรวจสอบว ่าสแตกว ่างเปลา่หร ือไม ่)

Page 6: สแตกและคิว (Stack & queue)

การนำาข้อมูลเข้าไปในกองซ้อน (Push)เป็นการดำาเนินการที่นำาข้อมูลเข้าไปเก็บ

ไว้ด้านบนสุดของกองซ้อน (Top of the Stack) เรื่อย ๆ จนกว่ากองซ้อนไม่สามารถนำาขอ้มูลเข้าไปเก็บได้

จะเรียกว่า กองซ้อนเต็ม (Stack Full)

Page 7: สแตกและคิว (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: สแตกและคิว (Stack & queue)

การนำาข้อมูลออกจากกองซ้อน (Pop) การทำางานจะตรงข้ามก ับ Pushจะดึงเอาข้อมูลที่อยู่บนสุดออกมาก่อน แต่กอ่นที่จะดึงจะ

มีการตรวจสอบว่ากองซ้อนว่างหรือไม่ ถ้าว ่างจะไมส่ามารถนำาข ้อม ูลออกได้

แสดงว่ากองซ้อนว่าง (Stack Empty)ถ้าไม่ว่างจะนำาเอาข้อมูลออกแล้วเล ื่อนต ัว

ช ีไ้ปยงัต ำาแหนง่ถ ัดลงไป

Page 9: สแตกและคิว (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: สแตกและคิว (Stack & queue)

การสร ้าง stack ด้วย Arrayหมายถึง การแทนที่ข ้อมลูของstack ด้วย array ซึ่ง เป็นการจ ัดสรร

เน ื้อท ี่หน ่วยความจำาแบบ static นั่นคอื

มีการก ำาหนดขนาดของ stack ล่วงหน้าว่ามีขนาดเท่าใด และจะมีการจัดสรรเนื้อที่หน่วยความจำาให้เลย

Page 11: สแตกและคิว (Stack & queue)

การแทนทีโ่ครงสร้างข้อมูลแบบกองซ้อนด้วยแถวลำาดับ

แบบลำาดับจะต้องมีการจองพื้นที่หน่วยความจำาไว้ล่วงหน้า ว่าจะมีขนาดเท่าใด

โดยแถวล ำาด ับน ี้จะป ิดปลายดา้นหนึ่งไว ้ เพ ื่อให ้ข ้อม ูลเข ้า -ออกทางเด ียว

ปฏิบัติการมี 4 ข้ันตอนคือการสร้างการ Pushการ Popการ แสดง

Page 12: สแตกและคิว (Stack & queue)

การสร้างกองซ้อนด้วยแถวลำาดับเป็นการเตรียมเน้ือที่ในหน่วยความจำาไว้สำาหรับเก็บ

ข้อมูลตัวอย่างในภาษาซี คือ

int Stack[4];

การนำาข้อมูลเข้าและออกจากหน่วยความจำาด้วยแถวลำาดับ ก็เหมือนกับที่ยกตัวอย่างไปแล้ว

Stack

Page 13: สแตกและคิว (Stack & queue)

การแสดงข้อมูลทีอ่ยู่ในกองซ้อนด้วยแถวลำาดับจะเป็นการดึงข้อมูลตั้งแต่ตำาแหน่งแรกจนถึงตำาแหน่งที่

Top ชี้อยู่ออกมาแสดงหรือจะกลบักันคือ นำาข้อมูลจากตำาแหน่ง Top ชี้อยู่จนถึง

ตำาแหน่งที่ 0 ออกมาแสดง

Page 14: สแตกและคิว (Stack & queue)

I

0

1

2

3

4

Stack

แสดงข้อมูล

10

15

40

60Top

60

40

15

10

Page 15: สแตกและคิว (Stack & queue)

การสร ้าง stack ด้วย Link List หมายถึง การแทนที่ข้อมูลของ stack

ด้วย Link list ซึ่งเป็นการจัดสรรเนื้อที่หน่วยความจำาแบบ Dynamic นั่นคอื หน่วยความจำาจะถูกจัดสรรเมื่อมีการของใช้จริงๆ ระหว่างการประมวลผล

โปรแกรมผ่านตัวแปรชนิด Pointer

Page 16: สแตกและคิว (Stack & queue)

การแทนทีโ่ครงสร้างข้อมูลกองซ้อนด้วยรายการโยงเป็นการแทนที่ท ี่ม ีความย ืดหย ุ่นมาก เน่ืองจากไม่ต ้องก ำาหนดหรือจองหน่วยความจ ำา

ลว่งหน้าข้อมูลที่เก็บในกองซ้อนมีจำานวนเท่าใดก็ได้ การปฏิบัติ

การมี 4 ข้ันตอนคือ การสร้าง, การ Push, การ Pop และการแสดง

Page 17: สแตกและคิว (Stack & queue)

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

รายการโยงแบบเดีย่ว การสร้างจะเป็นดังน้ี

typedef struct node

{ int data;

struct node *Next;

} node;

node *Top;

int info;

data

node

Next

Page 18: สแตกและคิว (Stack & queue)

การนำาข้อมูลเข้าไปในกองซ้อนแบบรายการโยง

80 ^

P

Top

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

Page 19: สแตกและคิว (Stack & queue)

การนำาข้อมูลเข้าไปในกองซ้อนแบบรายการโยง

เพิ่มข้อมูล 90 เข้าไปในรายการโยง

80 ^

Top

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

P

90Top

Page 20: สแตกและคิว (Stack & queue)

การนำาข้อมูลเข้าไปในกองซ้อนแบบรายการโยง

80 ^

Top

1. New(P)2. Data(P) = 120

3. Next(P) = Top

4. Top = p

P

120Top 90

Page 21: สแตกและคิว (Stack & queue)

การนำาข้อมูลออกจากกองซ้อนด้วยรายการโยง

80 ^

TopTemp

120Top 90

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

Page 22: สแตกและคิว (Stack & queue)

การนำาข้อมูลออกจากกองซ้อนด้วยรายการโยง

TopTemp

90Top 80

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

^

Page 23: สแตกและคิว (Stack & queue)

การนำาข้อมูลออกจากกองซ้อนด้วยรายการโยง

Top = NULLTemp

80Top

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

Page 24: สแตกและคิว (Stack & queue)

การนำาข้อมูลออกจากกองซ้อนด้วยรายการโยง

Top = NULL

1. Temp=Top

Stack Empty

Page 25: สแตกและคิว (Stack & queue)

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

80 ^

P

120Top 90

P P

120 90 80

Page 26: สแตกและคิว (Stack & queue)

การประย ุกต ์ใช ้ stack โครงสร้างข้อมูลแบบ stack มีการประยุกต์ใช้มากใน

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

Page 27: สแตกและคิว (Stack & queue)

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

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

Page 28: สแตกและคิว (Stack & queue)

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

Page 29: สแตกและคิว (Stack & queue)

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

Factorialการคำานวณนิพจน์ทางคณิตศาสตร์

Page 30: สแตกและคิว (Stack & queue)

การเรียกใช้โปรแกรมอื่น

Stack

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

Call Cสิ้นสุดโปรแกรม

-----Call B1

-----Return

----------

Return

----------

Return1000

1500

B B1

C

1000

1500

Page 31: สแตกและคิว (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: สแตกและคิว (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: สแตกและคิว (Stack & queue)

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

ในการตรวจสอบอักขระสมดุลน ัน้ คอมไพเลอร ์ ได้น ำาแนวคิดโครงสร ้างข ้อมลูแบบ Stack มา

ประยกุต ์ โดยมวี ิธกีารดงัน ี้1. ใหอ้ ่านอักขระทลีะต ัว - ถา้อ ักขระเป ็นอ ักขระเป ิด เช ่น {,(,[ เป ็นต ้น

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

ให้ตรวจสอบว่าอ ักขระ บน TOP ของ stack เป ็นอ ักขระเป ิดท ีค่ ู่ก ันหร ือไม ่

- ถา้ใช่ ให ้ POP อักขระนัน้ออกจาก stack - ถา้ไมใ่ช ่ ใหแ้สดงผล error2. เม ือ่อ ่านอ ักขระหมดแล้ว แต่ stack ไมเ่ป ็น

stack ว ่าง ใหแ้สดงผล error

Page 34: สแตกและคิว (Stack & queue)

โพลิช โนเตชัน(Polish Notation)

เป็นวิธีการจัดรูปแบบของสมการใหม่ โดยการย ้าย ตำาแหน่งของเคร ื่องหมายและตัวด ำาเน ินการ เชน่ 2*3

เข ียนเป ็น *23 เป็นต้น โดยมีรูปแบบการเขียนสมการ ดังน้ีPrefix : การเขียนสมการโดยให้เครื่องหมายอยู่หน้าตัว

ดำาเนินการ เช่น * + 5 3 2Infix : การเขียนสมการโดยให้เครื่องหมายอยู่ระหว่างตัว

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

ดำาเนินการ เช่น 5 3 + 2 *

Page 35: สแตกและคิว (Stack & queue)

Algorithm การคำานวณแบบ Postfix

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

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

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

Page 36: สแตกและคิว (Stack & queue)

Algorithm การคำานวณแบบ Postf ix

Page 37: สแตกและคิว (Stack & queue)

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

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

1. ใส่ “ (“ เข้าไปใน Stack2. อ่าน EXP จากซ้ายไปขวา 2.1 ถ้าพบตัวถกูดำาเนินการ(ตัวเลข) ให้ใส่เข้าไป

ใน NEXP 2.2 ถ้าพบ “ (“ ให้ push ใส่ stack

Page 38: สแตกและคิว (Stack & queue)

ว ิธ ีการเปล ี่ยน Infix เป ็น Postfix2.3 ถ้าพบตัวดำาเนินการ(เครื่องหมาย) ให้ทำาดังน้ี - ให้ pop ตัวดำาเนินการ ทุกตัวที่มีลำาดับความสำาคัญ

กว่าตัวดำาเนินการที่พบใน 2.3 ออกมาใส่ใน NEXP ให้หมด - นำาตัวดำาเนินการที่พบใน 2.3 push เข้าใน stack

แทนที่2.4 ถ้าพบ “ )” ให้ทำาดังน้ี - ให้ push ตัวดำาเนินการ ทุกตัวมาใส่ไว้ใน NEXP ให้

หมดจนพบ “ (“ - push “(“ ทิ้ง3. จบการทำางาน

Page 39: สแตกและคิว (Stack & queue)

ความสำาคญัของตวัดำาเนนิการ

เคร ื่องหมาย ความสำาคญัเม ือ่อย ู่ในStack

ความสำาคญัเม ือ่อย ูท่ ี่อ ินพ ุต

** (ยกกำาลัง) 3 4

* , / 2 2

+ , - 1 1

( 0 3

Page 40: สแตกและคิว (Stack & queue)

A + B

เครื่องหมาย

Stack นพิจน์ Postfix

A+B

ว่าง++

AAABAB+

Page 41: สแตกและคิว (Stack & queue)

A + B * C

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

A+B*C

ว่าง+++ , *+ , *

AAABABABCABC*+

Page 42: สแตกและคิว (Stack & queue)

(A + B) * C

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

(A+B)*C

(((+(+ว่าง * *

ว่างAAABAB+AB+AB+CAB+C*

Page 43: สแตกและคิว (Stack & queue)

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

Page 44: สแตกและคิว (Stack & queue)

8*(4+3)-9/6เครื่องหมาย Stack นพิจน์ Postfix

8*(4+3)-9 /6ว่าง

ว่าง**(*(*(+*(+*--- /- /

8888 48 48 4 38 4 3 +8 4 3 + *8 4 3 + * 98 4 3 + * 98 4 3 + * 9 68 4 3 + * 9 6 / -

Page 45: สแตกและคิว (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