ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
1
กองซ้อน ยอดกองซ้อน (stack)
2
และเรียกปลายด้านนั้นว่า ยอดกองซ้อน(top of stack)
กองซ้อน จัดเป็นรายการที่การนำเข้าสมาชิก(เพิ่ม)หรือการนำออกสมาชิก(ลบ) จะกระทำที่ปลายด้านหนึ่งของรายการ และเรียกปลายด้านนั้นว่า ยอดกองซ้อน(top of stack) การนำสมาชิกเข้าไปวางไว้ในกองซ้อน เรียกว่า push การนำสมาชิกออกจากกองซ้อน เรียกว่า pop
3
ยอดกองซ้อน push pop
4
C B B A A A กองซ้อนว่าง push ‘A’ push ‘B’ push ‘C’ D B A A A pop pop push ‘D’
5
การแทนกองซ้อนด้วยตัวแปรแถวลำดับ
stack เป็นตัวแปรแถวลำดับ 1 มิติแทนกองซ้อน top เป็นตัวแปรระบุยอดกองซ้อน (top = -1 คือกองซ้อนว่าง) n เป็นจำนวนสมาชิกของตัวแปร stack x เป็นข้อมูล stack 1 2 3 4 5 6 7 top = -1 n = 8
6
ฟังก์ชันนำข้อมูลเข้าสู่กองซ้อน
push(int stack[ ],int *top,int n,int x) { if (*top < n-1) {*top = *top + 1 ; /* increment top) */ stack[*top] = x; /*insert element */ } else printf(“stack overflow\n”); return 0; เริ่มต้น top = -1 คือกองซ้อนว่าง
7
ฟังก์ชันนำข้อมูลออกจากกองซ้อน
pop(int stack[ ],int *top,int *x) { if (*top >= 0) { *x = stack[*top]; /* delete element */ *top = *top -1 ; /*decrement top */ } else printf(“stack underflow \n”); return 0;
8
แบบฝึกหัด เริ่มต้น top = -1 คำสั่ง push(stack,&top,n,15);
pop(stack,&top,&x); จะได้ค่า x = push(stack,&top,n,25); push(stack,&top,n,45); push(stack,&top,n,38); push(stack,&top,n,49); push(stack,&top,n,50); push(stack,&top,n,60); push(stack,&top,n,20); จบแล้ว top = จำนวนสมาชิกในกองซ้อน =
9
การประยุกต์กองซ้อน การเก็บลำดับเพื่อการย้อนกลับ C A D G B H I F E
จากจุด A ไปจุด B : push A จากจุด B ไปจุด C : push B จากจุด C ไปจุด D : push C จากจุด D ไปจุด E : push D pop : กลับไปจุด D pop : กลับไปจุด C pop : กลับไปจุด B pop : กลับไปจุด A C A D G B H I F E
10
การจัดการโปรแกรมที่เรียกใช้โปรแกรมย่อยแบบต่อเนื่อง
main call f1 f1(…) call f2 return f2(…) call f3 return f3(…) return เมื่อมีการเรียกโปรแกรมย่อยใด จะ push ตำแหน่งกลับลงกองซ้อน เมื่อจบโปแกรมย่อยใด จะ pop ตำแหน่งกลับ(มาดูเพื่อกลับไปยังตำแหน่งที่มา)
11
การจัดการโปรแกรมที่เรียกใช้ตัวเอง(recursive program)
long int factorial(int n;) { if (n == 0)return 1; else return n*factorial(n-1); }
12
นิพจน์แบบโพสต์ฟิกซ์(postfix expression)
infix expression postfix expression A+B AB+ A+B+C AB+C+ A-B*C ABC*- A*(B+C) ABC+* A+B/(C+D)*E ABCD+/E*+ (A+B*C)/(E-F)+G ABC*+EF-/G+
13
เปลี่ยน infix expression ไปเป็น postfix expression
infix (A+B*C)/(E-F)+G 1. เข้าวงเล็บตามลำดับการคำนวณด้วยวิธีในระบบคอมพิวเตอร์ (ที่มีอยู่แล้วไปต้องใส่) (((A+(B*C))/(E-F))+G) 2. ย้ายตัวดำเนินการไปแทนที่เครื่องหมายวงเล็บของมัน (((A (B C*+ (E F-/ G+ 3. ลบเครื่องหมานวงเล็บเปิดออก A B C*+ E F-/ G+ postfix
14
การคำนวณนิพจน์แบบโพสต์ฟิกซ์
จะพิจารณานิพจน์จากซ้ายไปขวา เมื่อพบตัวดำเนินการ จะนำตัวถูกดำเนินการที่อยู่ข้างหน้าสองตัวมาคำนวณได้ผลลัพธ์ให้วางไว้ที่ตำแหน่งนั้นแล้วดำเนินการต่อไปจนจบนิพจน์ จะเหลือผลลัพธ์ตัวเดียวซึ่งคือคำตอบของนิพจน์ ตัวอย่าง 9,4,2,/,+,3,9,4,-,*,2,3,+,/,- 9, 2 ,+,3,9,4,-,*,2,3,+,/,- 11 ,3,9,4,-,*,2,3,+,/,- 11 ,3, 5 ,*,2,3,+,/,- 11 , ,2,3,+,/,- 11 , , ,/,- 11 , ,- 8
15
อัลกอริทึมในการเขียนโปรแกรมคำนวณ
อ่านนิพจน์ที่เป็นแบบโพสต์ฟิกซ์ แล้วตรวจสอบว่าเป็น ตัวดำเนินการ หรือตัวถูกดำเนินการ ถ้าเป็นตัวถูกดำเนินการ ให้ push ลงกองซ้อน ถ้าเป็นตัวดำเนินการ ให้ pop ตัวถูกดำเนินการในกองซ้อนออก มา 2 ตัว เพื่อคำนวณ โดยให้ตัวแรกเป็นตัวกระทำ ตัวที่สองเป็นตัวตั้ง ได้ผลลัพธ์ให้ push ลงกองซ้อน เมื่ออ่านจบนิพจน์แล้ว จะเหลือคำตอบอยู่ในกองซ้อน
16
แบบฝึกหัด 0 1 2 3 n-3 n-2 n-1 45 32 18 12 13 72 98 กองซ้อน A กองซ้อน B
1. จงเขียนฟังก์ชันเพื่อเปลี่ยนเลขฐานสิบ ให้เป็นฐาน x ใด (2 ≤ x ≤9) โดยต้องใช้ฟังก์ชัน push และ pop ช่วยด้วย 2. จงเขียนฟังก์ชัน push และ pop โดยใช้ตัวแปรแถวลำดับแทนกองซ้อน ซึ่ง top = n แทนกองซ้อนว่าง และ top = 0 คือกองซ้อนเต็ม 3. กำหนดตัวแปรแถวลำดับ stack[n] ใช้แทนกองซ้อน 2 กองคือ กองซ้อน A และ กองซ้อน B โดยใช้คนละปลายของตัวแปรแถวลำดับ จงเขียนฟังก์ชัน pusha, popa, pushb, popb เพื่อนำข้อมูลไปไว้หรือนำออกจากกองซ้อน A และ B ตามลำดับ n n-2 n-1 45 32 18 12 13 72 98 กองซ้อน A กองซ้อน B topa = topB = n-3
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.