กองซ้อน(stack)

Download Report

Transcript กองซ้อน(stack)

กอง
้ น
ซ
อ
(stack)
ยอดกอง
ซ ้อน
้ จัดเป็ นรายการทีก
กองซอน
่ ารนาเข ้า
ิ (เพิม
ิ (ลบ)
สมาชก
่ )หรือการนาออกสมาชก
จะกระทาทีป
่ ลายด ้านหนึง่ ของรายการ
้
และเรียกปลายด ้านนัน
้ ว่า ยอดกองซอน(top
of stack)
ิ เข ้าไปวางไว ้ในกองซอน
้
การนาสมาชก
เรียกว่า push
ิ ออกจากกองซอน
้
การนาสมาชก
เรียกว่า pop
push
pop
ยอดกอง
ซ ้อน
C
้
กองซอน
ว่าง
B
A
pop
A
B
A
push ‘A’
push ‘B’
B
A
push ‘C’
D
A
pop
A
push ‘D’
้
การแทนกองซอนด
้วยตัวแปร
แถวลาดับ
้
stack เป็ นตัวแปรแถวลาดับ 1 มิตแ
ิ ทนกองซอน
้
top เป็ นตัวแปรระบุยอดกองซอน
(top = -1 คือกอง
้
ซอนว่
าง)
ิ ของตัวแปร stack
n
เป็ นจานวนสมาชก
x
เป็ นข ้อมูล
stack
0
top = 1
1
2
3
4
n=8
5
6
7
ฟั งก ์ช ันนำข้อมู ลเข้ำ
สู ก
่ องซ ้อน
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 คือกอง
้
ซอนว่
าง
ฟั งก ์ช ันนำข้อมู ลออก
จำกกองซ ้อน
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;
}
แบบฝึ กหัด
เริม
่ ต ้น top = -1
คาสงั่
push(stack,&top,n,15);
push(stack,&top,n,30);
pop(stack,&top,&x);
จะได ้ค่า x =
push(stack,&top,n,25);
push(stack,&top,n,45);
push(stack,&top,n,38);
pop(stack,&top,&x);
จะได ้ค่า x =
push(stack,&top,n,49);
push(stack,&top,n,50);
pop(stack,&top,&x);
จะได ้ค่า x =
push(stack,&top,n,60);
push(stack,&top,n,20);
จบแล ้ว top =
=
ิ ในกองซอน
้
จานวนสมาชก
การประยุกต์
้
กองซอน
การเก็บลาดับเพือ
่ การ
ย ้อนกลับ
จากจุด A ไปจุด B
A
: push
จากจุด B ไปจุด C
B
: push
จากจุด C ไปจุด D
C
: push
จากจุด D ไปจุด E
D
: push
H
A
I
B
D
G
C
E
F
pop : กลับไปจุด D
pop : กลับไปจุด C
pop : กลับไปจุด B
pop : กลับไปจุด A
่ ยกใช้
กำรจัดกำรโปรแกรมทีเรี
โปรแกรมย่อยแบบต่อเนื่อง
main
f1(…)
f2(…)
f3(…)
call f2
call f3
return
call f1
return
return
เมือ
่ มีการเรียกโปรแกรมย่อยใด จะ push ตาแหน่งกลับ
้
ลงกองซอน
เมือ
่ จบโปแกรมย่อยใด จะ pop ตาแหน่งกลับ(มาดูเพือ
่
การจัดการโปรแกรมทีเ่ รียกใชตั้ วเอง(recursive
program)
long int factorial(int n;)
{ if (n == 0)return 1;
else return n*factorial(n-1);
}
นิพจน์แบบโพสต์ฟิกซ(์ 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+
เปลีย
่ น 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
การคานวณนิพจน์แบบ
์
โพสต์
ฟ
ิ
ก
ซ
้
จะพิจารณานิพจน์จากซายไปขวา
เมือ
่ พบตัวดาเนินการ
จะนาตัวถูกดาเนินการทีอ
่ ยูข
่ ้างหน ้าสองตัวมาคานวณ
ได ้ผลลัพธ์ให ้วางไว ้ทีต
่ าแหน่งนัน
้ แล ้วดาเนินการต่อไป
จนจบนิพจน์ จะเหลือผลลัพธ์ตวั เดียวซงึ่ คือคาตอบของ
นิพจน์
ตัวอย่าง 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 , 15 ,2,3,+,/,11 , 15 , 5 ,/,11 ,
3
,8
อัลกอริทม
ึ ในการเขียน
โปรแกรมคานวณ
อ่านนิพจน์ทเี่ ป็ นแบบโพสต์ฟิกซ ์ แล ้ว
ตรวจสอบว่าเป็ น
ตัวดาเนินการ หรือตัวถูกดาเนินการ
ถ ้าเป็ นตัวถูกดาเนินการ ให ้ push ลงกอง
้
ซอน
ถ ้าเป็ นตัวดาเนินการ ให ้ pop ตัวถูก
้
ดาเนินการในกองซอนออก
มา 2 ตัว เพือ
่ คานวณ โดยให ้ตัวแรกเป็ นตัวกระทา
ตัวทีส
่ องเป็ นตัวตัง้
แบบฝึ กหัด
ั เพือ
ิ ให ้เป็ นฐาน x ใด (2
1. จงเขียนฟั งก์ชน
่ เปลีย
่ นเลขฐานสบ
ั push และ pop ชว่ ยด ้วย
≤ x ≤9)
โดยต ้องใชฟั้ งก์ชน
ั push และ pop โดยใชตั้ วแปรแถวลาดับ
2. จงเขียนฟั งก์ชน
้
้
แทนกองซอน
ซงึ่ top = n แทนกองซอนว่
าง และ top = 0
้
คือกองซอนเต็
ม
้
้ 2 กอง
3. กาหนดตัวแปรแถวลาดับ stack[n] ใชแทนกองซ
อน
้ A และ กองซอน
้ B โดยใชคนละปลายของตั
้
คือ กองซอน
ว
ั pusha, popa, pushb, popb
แปรแถวลาดับ จงเขียนฟั งก์ชน
้ A และ B
เพื
อน
0อ่ นาข ้อมู
1ลไปไว ้หรื
2 อนาออกจากกองซ
3
ตามลาดับ
n-3 32 18
n-2 12n-1
45
้ A
กองซอน
้ B
กองซอน
topa = 3
topB = n-3
13 72 98