งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

Stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์ เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการ สื่อสาร Website : ict.up.ac.th/yeunyong.

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "Stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์ เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการ สื่อสาร Website : ict.up.ac.th/yeunyong."— ใบสำเนางานนำเสนอ:

1 stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์ เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการ สื่อสาร Website : ict.up.ac.th/yeunyong

2 หัวข้อวันนี้ ADT of stack Value Definition Operation Definition Implementations of stack ( โดยใช้ array) Accessing Stack Example ปัญหาในการสร้างสแตกและวิธีแก้ไข 2

3 Example of Stack 3 ลักษณะของ stack ใน ชีวิตประจำวัน

4 ADT : Value Definition ข้อมูลที่จะเก็บในสแตกจะมีค่าเป็นอย่างไรก็ได้ ขึ้นอยู่กับว่าเราจะเก็บข้อมูลอะไร เช่น อาจเป็นตัวเลข ตัวอักษร หรือข้อมูลเชิง โครงสร้าง (Structure Data Type) มีความสัมพันธ์แบบเชิงเส้น ข้อมูลถูกเก็บเป็นแถวเรียงต่อกันไปใน หน่วยความจำ มีลำดับของการใส่ข้อมูลและนำข้อมูลออก 4

5 ADT : Value Definition (cont’) ข้อมูลที่เข้าสแตกทีหลังจะทับอยู่บนตัวก่อน หน้า ข้อมูลที่จะนำออกจากสแตกได้ต้องเป็นข้อมูล ที่อยู่ตำแหน่งบนสุดเท่านั้น เรียกตำแหน่งนี้ว่า top of stack ข้อมูลที่นำเข้าไปในสแตกทีหลังจะถูกนำ ออกมาใช้งานก่อน เข้าหลังออกก่อน (Last In First Out : LIFO) 5

6 ADT : Operation Definition การเพิ่มข้อมูล (push) ใส่ข้อมูลลงด้านบนสุดของโครงสร้าง ( วาง ทับตำแหน่ง top of stack เดิม และส่งผลให้ ตำแหน่งของข้อมูลตัวนั้นกลายเป็น top of stack ตัวใหม่ ) การดึงข้อมูล (pop) นำข้อมูลที่อยู่ด้านบนสุดของโครงสร้างออก ( ดึงข้อมูล ณ ตำแหน่ง top of stack ออก และส่งผลให้ตำแหน่ง top of stack ย้ายไป อยู่ที่ตำแหน่งของข้อมูลลำดับถัดลงไป ) 6

7 7 แสตก s ว่าง Top = 0 s Top = 1 s ใส่ ‘a’ push(‘a ’,s) Top = 2 ใส่ ‘b’ push(‘a ’,s) a s Top = 1 a s b X=pop( s) X=‘ b’ a b

8 8 Top = 3 ใส่ ‘c’ push(‘c ’,s) a s a Top = 3 ใส่ ‘d’ push(‘d ’,s) a s a Top = 2 a s a c y=pop( s) y=‘ c’ Top = 2 ใส่ ‘a’ push(‘a ’,s) a s a c d

9 Implementation of stack ( โดยใช้ array ) 9

10 จาก ADT ได้ข้อสังเกต โครงสร้างสแตก มีลักษณะเป็นสายข้อมูล เรียงต่อกัน นำข้อมูลเข้า / ออก ได้ที่ปลายสายเท่านั้น Array มีลักษณะโครงสร้างเป็นสายข้อมูล เช่นกัน แต่นำข้อมูลเข้า / ออก ที่ตำแหน่งไหนก็ ได้ สร้าง Array และบังคับให้เข้าถึงได้เฉพาะปลาย ด้านหนึ่ง โครงสร้างสแตก ปัญหา -> จะรู้ได้อย่างไรว่าตอนนี้ปลายสายอยู่ ที่ตำแหน่งไหน ? 10

11 ภาษาซี นิยมสร้างสแตกโดยกำหนดเป็นตัวแปร แบบ structure ที่ประกอบไปด้วยเขตข้อมูล 2 เขต คือ อาร์เรย์ที่ใช้เก็บข้อมูลของสแตก ( อาจเป็น อาร์เรย์ของข้อมูลเชิงเดี่ยวหรืออาร์เรย์ของ ข้อมูลเชิงโครงสร้างก็ได้ ) จำนวนเต็มที่บอกตำแหน่งปัจจุบันของส่วน บนสุดของสแตก ( ทำหน้าที่บอก index ของ top of stack) Operation ที่เกี่ยวข้อง เขียนเป็นฟังก์ชัน โดยให้สามารถทำงาน ตาม ADT ได้ 11

12 Accessing Stack การเข้าถึงข้อมูลใน โครงสร้างสแตก เมื่อ สร้างด้วยอาร์เรย์ จำเป็นต้องอาศัย index ซึ่งทำหน้าที่ชี้ ตำแหน่งของข้อมูลตัว บนสุดของสแตก (top of stack) เสมอ 12 A A B B C C D D inde x โครงสร้างข้อมูลสแตก (Top of stack)

13 13 … … 82 … 826 … inde x Stack[ 100] แสดงโครงสร้างข้อมูลสแตกชื่อ Stack[100] 3 Accessing Stack (cont.)

14 Ex. การสร้างสแตก #define STACKSIZE 10 // กำหนดขนาด ของสแตก typedef struct { int data[STACKSIZE]; // กำหนดเป็นสแตก ของ int // โดยใช้ตัวแปรอาร์เรย์ int index; // กำหนด index ของสแตก } STACK; STACK s; // กำหนดตัวแปรส แตกไว้ใช้งาน #define STACKSIZE 10 // กำหนดขนาด ของสแตก typedef struct { int data[STACKSIZE]; // กำหนดเป็นสแตก ของ int // โดยใช้ตัวแปรอาร์เรย์ int index; // กำหนด index ของสแตก } STACK; STACK s; // กำหนดตัวแปรส แตกไว้ใช้งาน 14

15 Ex. การสร้างฟังก์ชัน push() parameter ข้อมูลที่จะใส่ลงสแตก ชื่อของตัวแปรสแตกที่จะใส่ข้อมูลลง ไป return value ไม่มี body of function เพิ่มค่าตัวแปร index ( เพิ่มตำแหน่ง top of stack) นำข้อมูลใส่อาร์เรย์ ณ ตำแหน่ง index (push ค่าลง ณ ตำแหน่ง top of stack) 15

16 Ex. การสร้างฟังก์ชัน pop() parameter ชื่อของตัวแปรสแตกที่จะดึงข้อมูล ออกมา return value ผลลัพธ์ของการดึงข้อมูล ( ชนิดตาม ชนิดของข้อมูลใน stack) body of function return ข้อมูลในอาร์เรย์ ณ ตำแหน่ง index ออกจากฟังก์ชัน (pop ค่า ณ ตำแหน่ง top of stack ออก ) ลดค่า index ลงมา 1 ตำแหน่ง ( ลด ตำแหน่ง top of stack ลง ) 16

17 Ex. ฟังก์ชัน push() และ pop() void push ( int x, STACK *s ){ s->index = s- >index+1; s->data[s->index] = x; } int pop ( STACK *s ){ return s->data[s- >index--]; } 17 ถ้ามีข้อมูลเต็ม อาร์เรย์ ? ถ้าไม่มีข้อมูลใน อาร์เรย์ ? ตอนเริ่มทำงาน stack index (s- >index) ชี้ไปที่ ไหน ?

18 ปัญหาในการสร้าง สแตก stack overflow – ปัญหาที่จะเกิดขึ้นเมื่อมีการ นำเข้าข้อมูล (push) ลงสแตก ( อาร์เรย์ ) ที่มี ข้อมูลอยู่เต็มแล้ว stack underflow – ปัญหาที่จะเกิดขึ้นเมื่อมี การดึงข้อมูล (pop) จากสแตก ( อาร์เรย์ ) ที่ไม่ มีข้อมูลอยู่ จำเป็นต้องมีฟังก์ชันที่จะทำการกำหนดค่า เริ่มต้นของตำแหน่ง top of stack ให้กับตัว แปรนั้น ( กระทำหลังจากที่ประกาศตัวแปร ชนิดสแตกเสร็จ ) 18

19 Ex. ฟังก์ชัน stack_initial(), stack_empty(), stack_full() เนื่องจากอาร์เรย์ในภาษาซีข้อมูลตัวแรกเริ่มต้น ที่ลำดับที่ 0, และข้อมูลตัวสุดท้ายคือลำดับที่ n-1 เมื่อ n คือขนาดของอาร์เรย์ ดังนั้นเมื่อเราสร้างสแตกด้วยอาร์เรย์ในภาษาซี จึงต้องคำนึงถึงลักษณะของอาร์เรย์ด้วย อาจกำหนดได้ดังนี้ สแตกว่าง – stack index มีค่า -1 สแตกเต็ม – stack index มีค่า n-1 19

20 Ex. การสร้างฟังก์ชัน stack_initial() parameter ชื่อของตัวแปรสแตกที่จะกำหนดค่า เริ่มต้น return value ไม่มี body of function กำหนดค่า index เป็น -1 พึ่งประกาศตัวแปร ดังนั้นสแตกจึงยัง ว่างอยู่ 20

21 Ex. stack_initial() void stack_initial ( STACK *s ) { s->index = -1; } เรียกใช้หลังจากสร้าง stack แค่ครั้งเดียว กำหนดตำแหน่งเริ่มต้นของ top of stack 21

22 Ex. การสร้างฟังก์ชัน stack_empty() parameter ชื่อของตัวแปรสแตกที่จะตรวจสอบว่า ว่างหรือไม่ return value มีได้ 2 สถานะ คือ ว่าง (1) หรือ ไม่ ว่าง (0) body of function ตรวจสอบว่าสแตกว่างหรือไม่ (index == -1) ถ้าใช่ return 1 ถ้าไม่ใช่ return 0 22

23 Ex. stack_empty() int stack_empty ( STACK *s ) // ถ้า return 1, สแตกว่าง { // ถ้า return 0, สแตกไม่ว่าง if (s->index == -1) return 1 ; else return 0 ; } เรียกใช้ทุกครั้งก่อนที่จะ pop ข้อมูลจากสแตก ถ้า return 1 -> ห้าม pop ( อาจแสดง error บอกผู้ใช้ ) ถ้า return 0 -> เรียกใช้ฟังก์ชัน pop() เพื่อดึงข้อมูล 23

24 Ex. การสร้างฟังก์ชัน stack_full() parameter ชื่อของตัวแปรสแตกที่จะตรวจสอบว่า เต็มหรือไม่ return value มีได้ 2 สถานะ คือ เต็ม (1) หรือ ไม่ เต็ม (0) body of function ตรวจสอบว่าสแตกเต็มหรือไม่ (index == STACKSIZE-1) ถ้าใช่ return 1 ถ้าไม่ใช่ return 0 24

25 Ex. stack_full() int stack_full ( STACK *s ) // ถ้า return 1, สแตกเต็ม { // ถ้า return 0, สแตก ไม่เต็ม return (s->index == (STACKSIZE-1)) ; } เรียกใช้ทุกครั้งก่อนที่จะ push ข้อมูลลงสแตก ถ้า return 1 -> ห้าม push ( อาจแสดง error บอกผู้ใช้ ) ถ้า return 0 -> เรียกใช้ฟังก์ชัน push() เพื่อใส่ข้อมูล 25


ดาวน์โหลด ppt Stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์ เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการ สื่อสาร Website : ict.up.ac.th/yeunyong.

งานนำเสนอที่คล้ายกัน


Ads by Google