stack - sripatum universityspuccourseware.east.spu.ac.th/calibration/csc114/w2.pdf ·...

33
STACK 1

Upload: others

Post on 12-Mar-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

STACK

1

Stack(สแตก)

โครงสร้างข้อมูลที่ รู้จักและนํามาใช้งานมากชนิดหนึ่งก็ คือ

สแตก (Stack) มีลักษณะเป็นรายการในแนวเชิงเส้น (Linear List)

รูปแบบหนึ่ง และมีข้อกําหนดให้ชุดปฏิบัติการ สามารถเพิ่ม

และลบรายการเพียงด้านเดียว ซึ่ งเป็นด้านบนสุดของสแตก

(Top of Stack) เรียกว่า ตัวชีส้แตก (Stack Pointer) มีรูปแบบ

เป็น Top(S) โดยสแตกมีการกาํหนดเป็นรูปแบบ ดงันี ้

S =[S1,S2, . . . ,ST]

2

Stack(สแตก)

3

ด้านบนสุดของสแตกจะอยู่ที ่ Top(S) = ST และมจีํานวน

สมาชิกในสแตกเท่ากบั T

Stack(สแตก)

4

สแตกมลีกัษณะแบบเดยีวกบัทีว่างจานหรือถาดใน

ร้านอาหารทีม่สีปริงอยู่ด้านล่างและมจีานวางซ้อนเป็นขั้น ๆ

จะมเีพยีงจานทีอ่ยู่บนหยบิออกไปได้

Stack(สแตก)

5

สแตกถูกนํามาใช้แก้ไขปัญหาต่าง ๆ โดยใช้โครงสร้างสแตก

ซึ่งมลีกัษณะการทาํงานในรูปแบบทีเ่รียกว่าเข้าทีหลงัออกก่อน

(Last-In-First-Out, LIFO) เมื่อมคี่าใหม่เข้ามากจ็ะใส่ลงใน

สแตกซ้อนทบัค่าเดมิทีเ่กบ็อยู่ลงไปอยู่ด้านล่างไปเรื่อย ๆ ใน

ลกัษณะแบบนี ้ถ้าเป็นการดงึค่าออกจากสแตกค่าสุดท้ายทีใ่ส่

ลงไปกจ็ะถูกดงึออกมาให้ก่อน

คุณสมบตัดิ้านปฏบิตักิาร(operation) ของ Stack

•การเพิ่มหรือใส่ข้อมูล(Push)

•ลบหรือดงึข้อมูล(Pop)

6

การเพิ่มหรือใส่ข้อมูล(Push) ลง Stack(สแตก)

• อลักอริทมึการเพิ่มคา่ใหมเ่ก็บลงในสแตก

• 1. ตรวจสอบสแตกวา่มีสมาชิกอยูเ่ตม็หรือไม ่โดย

เปรียบเทียบคา่ Top กบัขนาดอาร์เรย์

• 2. ถ้าสแตกไมเ่ตม็

• 2.1 เพิ่มคา่ให้กบั Top โดยการบวก 1

• 2.2 ทําการนําคา่ที่ได้มาเก็บลงในสแตกในตําแหนง่ Top

• ไมเ่ชน่นัน้แจ้งกลบัมาวา่สแตกเตม็

7

Push (int value)

{

If (Top = = MaxStack )

printf (“Stack Overflow”);

Else

{

Top = Top +1 ;

Stack[Top] = Value;

}

}

Algorithm ของการ Push Stack

ลบหรือดงึข้อมูล(Pop) ใน Stack(สแตก)

• อลักอริทมึดงึคา่ออกจากสแตก

• 1. ตรวจสอบวา่สแตกวา่งหรือไม ่โดยเปรียบเทียบคา่ Top

กบัขนาดอาร์เรย์

• 2. ถ้าสแตกไมว่า่ง

• 2.1 ทําการดงึคา่ในตําแหนง่ Top ออกมาให้

• 2.2 ลดคา่ของ Top โดยการลบ 1

3/24/2016 วชิา BCS325 โครงสร้างขอ้มูล 9

Pop (int value)

{

If (Top = = 0)

printf (“Stack

Underflow”);

Else

{

Value = Stack[Top];

Top = Top – 1;

}

}

Algorithm ของการ Pop Stack

11

ตัวอย่างการนําข้อมูลเข้า (Push)

เริ่มต้นสร้างสแตก S ขึน้มาทาํงานจะ

ได้เป็นสแตกว่าง ไม่มสีมาชิกโดยตวัชี้

สแตก Top ยงัไม่มคี่า

นําค่า A เข้ามาเกบ็เป็นตวัแรกโดยใช้ Push(A)

สแตก S = [A] ตวัชี้สแตก Top = A

12

ตัวอย่างการนําข้อมูลเข้า (Push)

นําค่า B เกบ็ต่อโดยใช้ Push(B)

สแตก S = [A,B] ตวัชี้สแตก Top = B

นําค่า C เกบ็ต่อโดยใช้ Push(C)

สแตก S = [A,B,C] ตวัชี้สแตก Top = C

13

ตัวอย่างการนําข้อมูลออก (Pop)

ต้องการดงึค่าออกมาโดยใช้ Pop() สแตก

S = [A,B] ตวัชี้สแตก Top = B

นําค่า D, E เกบ็ต่อโดยใช้ Push(D) และ Push(E)

ตามลาํดบั สแตก S = [A,B,D,E]

ตวัชี้สแตก Top = E

14

ดงึค่าออกมา 3 ค่าโดยใช้ Pop() 3 ครั้งและเกบ็ค่า F

โดยใช้ Push(F) สแตก S = [A,F]

ตวัชี้สแตก Top = F

ตัวอย่างการนําข้อมูลออก (Pop)

การคาํนวณนิพจน์คณิตศาสตร์

15

• การเขียนนิพจน์คณิตศาสตร์เพื่อการคํานวณจะต้องคํานึงถึง

ลําดับความสําคัญของเครื่องหมายสําหรับการคํานวณด้วย

โดยทั่วไปนิพจน์คณิตศาสตร์สามารถเขียนได้ 3 รูปแบบ คือ

• นิพจน์อนิฟิกซ์ (Infix expression)

• นิพจน์โพสฟิกซ์ (Postfix expression)

• นิพจน์พรีฟิกซ์ (Prefix expression)

16

ลกัษณะนิพจน์แบบ Infix, Postfix, และ Prefix Notation

ตัวอย่างการแปลงนิพจน์ Infix เป็นแบบ Postfix

17

ตัวอย่างนิพจน์ 7 * 8 - ( 2 + 3 ) จะได้เป็นลาํดับขัน้ตอน

ดังนี ้

ตัวอย่างนิพจน์ Infix เป็นแบบ Postfix

18

การแปลงนิพจน์ Infix ไปเป็นนิพจน์ Postfix

19

ขัน้ตอนการแปลงนิพจน์ Infix ไปเป็นนิพจน์ Postfix

20

1. อ่านตวัอักขระในนิพจน์ Infix เข้ามาทลีะตวั

2. ถ้าเป็นตวัถกูดาํเนินการ(operand) จะถกูย้ายไปเป็น

ตวัอักษรในนิพจน์ Postfix

3. ถ้าเป็นตวัดาํเนินการ จะนําค่าลาํดบัความสาํคัญของ

ตวัดาํเนินการที่อ่านเข้ามาในขณะนัน้ไปเปรียบเทยีบกับ

ค่าลาํดบัความสาํคัญของตวัดาํเนินการที่อยู่บนสุดใน

Stack

ขัน้ตอนการแปลงนิพจน์ Infix ไปเป็นนิพจน์ Postfix

21

3.1 ถ้ามีค่าน้อยกว่าหรือเท่ากัน จะต้องทาํการ Pop ตวั

ดาํเนินการที่อยู่บนสุดใน Stack ขณะนัน้ไปเรียงต่อกับตัวอักษร

ในนิพจน์ Postfix

3.2 ถ้ามีค่ามากกว่า จะถูก Push ลงใน Stack

4. ตวัดาํเนินการที่เป็นวงเล็บเปิด ให้ Push “(“ ลงใน Stack

แต่ถ้าเจอตวัดาํเนินการเป็นวงเล็บปิด “)” กใ็ห้ Pop ตวั

ดาํเนินการใน Stack ไปต่อในนิพจน์ Postfix จนกว่าจะเจอ

เครื่องหมาย “(“

ขัน้ตอนการแปลงนิพจน์ Infix ไปเป็นนิพจน์ Postfix

22

5. เมื่อทาํการอ่านตวัอักษรในนิพจน์ Infix หมดแล้ว ให้ทาํ

การ Pop ตวัดาํเนินการทกตวัใน Stack มาเรียงต่อในนิพจน์

Postfix จะได้นิพจน์ Postfix ตามที่ต้องการ

23

24

ตัวอย่างนิพจน์ 2 4 * 9 5 + -

จะเป็นตามลาํดบัขั้นตอน

ดงันี้

ตัวอย่างนิพจน์ การหาค่าคาํตอบจากนิพจน์ Postfix

25

การหาค่าคาํตอบจากนิพจน์ การหาค่าคาํตอบจากนิพจน์ Postfix

การคาํนวณค่านิพจน์ Postfix ที่แปลงมาเรียบร้อยแล้ว

26

1. อ่านตวัอักษรในนิพจน์โพสฟิกซ์จากซ้ายไปขวาทลีะ

ตวัอักษรแล้วทาํข้อ 2

2. ถ้าเป็นตวัถูกดาํเนินการ ให้ทาํการพุชตวัถูกดาํเนินการนัน้

ลงในสแตก แล้วกลับไปอ่านตัวอักษรใหม่เข้ามา ในข้อ 1

3. ถ้าเป็นตวัดาํเนินการ ให้ทาํการพอ็ปค่าจากสแตก 2 ค่า

โดยตวัแรกเป็นตวัถูกดาํเนินการตัวที่ 2 และตวัต่อมาเป็นตวั

ถูกดาํเนินการตวัที่ 1

การคาํนวณค่านิพจน์ Postfix ที่แปลงมาเรียบร้อยแล้ว

27

4. ทําการคํานวณ ตัวถูกดําเนินการตัวที่ 1 ด้วยตัวถูก

ดาํเนินการตวัที่ 2 โดยใช้ตวัดาํเนินการในข้อ 3

5. ทาํการ Push ผลลัพธ์ที่ได้จากการคาํนวณในข้อ 4 ลงใน

Stack

6. ถ้าตัวอักษรในนิพจน์ Postfix ยังอ่านไม่หมดให้กลับไปทาํ

ข้อ 1 ถ้าหมดแล้วจบการทาํงาน

28

สรุปสแตก เป็นโครงสร้างข้อมูลที่ปฏบิัตกิารเพิ่มโหนดเข้าและดงึโหนด

ออกจาํกัดอยู่ที่ตาํแหน่งปลายด้านใดด้านหนึ่งของลิสต์ ลักษณะ

การปฏบิัตกิารเป็นแบบ “มาหลังไปก่อน” นั่นคือโหนด สุดท้ายที่

เข้ามาคือ โหนดแรกที่จะถูกดงึออก

การนําไปประยุกต์ใช้ในระบบปฏบิัตกิารของเครื่องคอมพวิเตอร์

หลายอย่างด้วยกัน เช่น การทาํงานของโปรแกรม หลักที่มีการ

เรียกใช้โปรแกรมย่อย การคาํนวณนิพจน์คณิตศาสตร์ และ

การเขียนโปรแกรมย่อยโดยใช้เทคนิครีเคอร์ชัน เป็นต้น

29

สรุป

สรุป

การแทนที่สแตกในความจาํหลัก

สามารถแทนที่ได้ 2 แบบคือ การแทนที่สแตกแบบสแตตกิซึ่ง

จะแทนควิในแถวลาํดบั และการแทนที่สแตกแบบไดนามิกซึ่ง

จะแทนควิด้วยลิงค์ลิสต์ โดยต้องมีพอยน์เตอร์ชีต้าํแหน่ง

บนสุดของสแตก เมื่อมีปฏบิัตกิารใด ๆ ต้องปรับพอยน์เตอร์นี ้

ให้สอดคล้องกับปฏบิัตกิารนัน้ ๆ

แบบทดสอบและกจิกรรมการฝึกทกัษะ

1.จงแสดงภาพขัน้ตอนการเก็บคา่ลงในสแตกเมื่อมีการใช้ชดุ

ปฏิบตัิการ Push และ Pop ตามลําดบัตอ่ไปนี ้

• Push(‘A’), Push(‘B’), Pop(), Push(‘C’), Push(‘D’), Pop(),

Pop(), Push(‘D’), Push(‘C’), Pop(), Push(‘B’)

30

แบบทดสอบและกจิกรรมการฝึกทกัษะ

2. สมมตุิให้ A = 7.0, B = 4.0, C = 3.0, และ D = -2.0 จงหาคา่

ผลลพัธ์ของนิพจน์ในแตล่ะข้อตอ่ไปนี ้

• (a) AB+C/D* (b) AB+CD++

• (c) ABCD+/* (d) AB+C+D+

• (e) ABC++D+ (f) AB-CD- -

31

แบบทดสอบและกจิกรรมการฝึกทกัษะ3. จงแปลงนิพจน์แบบ Infix ในแตล่ะข้อตอ่ไปนีไ้ปเป็นนิพจน์แบบ

RPN (Postfix)

(a) A*B+C-D (b) A+B/C+D

(c) (A+B)/C+D (d) (A+B)/(C+D)

(e) (A-B)*(C-(D+E)) (f) (((A-B)-C)-D)

32

แบบทดสอบและกจิกรรมการฝึกทกัษะ

4. จงแปลงนิพจน์แบบ RPN (Postfix) ในแตล่ะข้อตอ่ไปนีไ้ป

เป็นนิพจน์แบบ Infix

(a) ABC+-D* (b) AB+CD-*

(c) ABCD+-* (d) AB+C-DE*/

(e) ABC/D// (f) ABCD///

33