แถวคอย(queue)

Download Report

Transcript แถวคอย(queue)

แถวคอย
(queue)
แถวคอย จัดเป็ นรายการที่การนาเข้าสมาชิกจะเข้าที่ปลายข้างหนึ่งและ
การนาสมาชิกออกจะออกที่ปลายอีกข้างหนึ่ง
ปลายที่นาเข้า เรี ยกว่า ท้ายแถว(rear)
ปลายที่นาออกเรี ยกว่า หัวแถว(front)

  
เข้า
ออก
หัวแถว
ท้ ายแถว
การแทนแถวคอยด้วยตัวแปรแถวลาดับ
queue เป็ นตัวแปรแถวลาดับ 1 มิติ แทนแถวคอย
front เป็ นตัวแปรระบุตาแหน่งหัวแถว
rear เป็ นตัวแปรระบุตาแหน่งท้ายแถว
n เป็ นจานวนสมาชิกของตัวแปร queue
x เป็ นข้อมูล
queue
front = -1 rear = -1
แถวคอยว่าง
0
1
2
3
4
n=8
5
6
7
ฟังก์ ชันนาข้ อมูลไปไว้ ในแถวคอย
insert_queue(int queue[ ],int *front,int *rear,int n,int x)
{ if (*rear < n-1)
{ *rear = *rear + 1;
/* increment rear */
queue[*rear] = x;
/* insert element */
if (*front == -1) *front = 0; /* first element */
}
else printf(“ queue overflow\n”);
return 0;
}
จานวนสมาชิก(ถ้ามี)ในแถวคอยขณะเวลาใดๆ = rear – front +1
ฟังก์ ชันนาข้ อมูลออกจากแถวคอย
delete_queue(int queue[ ],int *front,int *rear,int *x)
{ if (*front != -1)
{ *x = queue[*front]; /* delete element */
if (*front == *rear)
{ *front = - 1;
*rear = -1;
} /* clear queue */
else *front = *front +1; /* move front */
else printf(“queue unferflow\n”);
return 0;
}
แถวคอย
45 62 71 35 24
0 1 2 3 4 5 6
front = 3 , rear = 7 แถวคอยเต็ม
7
3
4
45
62
แถวคอยวงกลม
2
71 5
1
35 6
24
0
7
front = 3 , rear = 7
เมื่อนาเข้าข้อมูลตัวใหม่(99) เข้าไป
99
0
45 62 71 35 24
1
2
3
4
5
6
7
3
4
45
front = 3 , rear = 0
62
2
71
1
35
0
99
24
7
5
6
ฟังก์ ชันนาข้ อมูลไปไว้ ในแถวคอยวงกลม
insert_cq(int queue[ ],int *front,int *rear,int n,int x)
{ if (*front != (*rear+1)%n)
{ *rear = (*rear + 1)%n; /* increment rear */
queue[*rear] = x;
/* insert element */
if (*front == -1) *front = 0; /* first element */
}
else printf(“ queue overflow\n”);
return 0;
}
จานวนสมาชิกในแถวคอยขณะเวลาใดๆ(กรณี แถวคอยไม่วา่ ง)
ถ้า front ≤ rear จานวนสมาชิก = rear – front +1
ถ้า front > rear จานวนสมาชิก = n+(rear-front+1)
ฟังก์ ชันนาข้ อมูลออกจากแถวคอยวงกลม
delete_cq(int queue[ ],int *front,int *rear,int *x)
{ if (*front != -1)
{ *x = queue[*front]; /* delete element */
if (*front == *rear)
{ *front = - 1;
*rear = -1;
} /* clear queue */
else *front = (*front +1)%n; /* move front */
else printf(“queue unferflow\n”);
return 0;
}
แถวคอยที่มีลาดับความสาคัญ
(priority queue)
แถวคอยที่สามารถแทรกได้

หัวแถว
ท้ ายแถว

แทรกตรงตาแหน่งใด
แทรกอย่างไร
แทรกตรงตาแหน่งใด
วิธีการ จะกาหนดให้สมาชิกแต่ละตัวมีลาดับความสาคัญ
โดยสมาชิกที่มีลาดับความสาคัญมากกว่า จะอยูใ่ นแถวคอยลาดับต้นๆ

 
1
2
2
3
หัวแถว
1
3
3
ท้ ายแถว
2
3
แทรกอย่างไร
ถ้าแถวคอยเป็ นแถวลาดับ 1 มิติ จะขยับสมาชิกส่ วนที่ถกู แทรกทั้งหมด
ถอยหลังไปเพื่อให้เกิดช่องว่างสาหรับแทรก

1
2
2
3
3

3
2

1
2
2
2
3
หลังจากขยับและแทรก
3
3
การออกแบบแถวคอยด้วยแถวลาดับ 2 มิติ
กาหนดให้แต่ละแถวเป็ นลาดับความสาคัญ และแต่ละหลักเป็ นลาดับ
สมาชิกในแถว
0
1
2
3
4
5
6
7
front
0
0
0
-1
rear
0
1
2
-1



1
2
2
3
3
3
แบบฝึ กหัด
1. จงเขียนฟังก์ชนั เพื่อนับจานวนสมาชิกในแถวคอยขณะเวลาใดๆ
int count(int front , int rear)
2. จงเขียนฟังก์ชนั เพื่อนับจานวนสมาชิกในแถวคอยวงกลมขณะเวลาใดๆ
int count(int front , int rear ,int n)
(ห้ามใช้ฟังก์ชนั วนลูป)
3. จงเขียนฟังก์ชนั เพื่อนาสมาชิกที่อยูห่ วั แถวออกและนาไปต่อท้ายแถว
(แถวคอยแบบวงกลม)
4. จงเขียนฟังก์ชนั แทนแถวคอยที่นาสมาชิกออกจากแถวแล้ว สมาชิกที่
เหลือต้องขยับขึ้นไปแทนที่
(สรุ ป ถ้ามีสมาชิกในแถว หัวแถวต้องอยูท่ ี่queue[0] เสมอ)
5. จงเขียนฟังก์ชนั การนาสมาชิกเข้าและออกจากแถวคอยแบบแทรกได้ เมื่อใช้แถว
ลาดับ 1 มิติแทนแถวคอย
6. จงเขียนฟังก์ชนั การนาสมาชิกเข้าและออกจากแถวคอยแบบแทรกได้ เมื่อใช้แถว
ลาดับ 2 มิติแทนแถวคอย