Transcript Queue

อ.วรพจน์ พรหมจักร
Queues Structure
โครงสรางการท
างานแบบคิว
้
คือการมีการจัดลาดับการเขา้
และออกขอมู
นลาดับ
้ ลอยางเป็
่
ขอมู
อนก็
จะ
้ ลใดเขามาก
้
่
ดาเนินการกอน
หากขอมู
่
้ ล
ใดเขามาที
หลังก็จะดาเนินการที
้
หลัง เรียกลักษณะของการ
ดาเนินการแบบนี้วา่
First In
ลักษณะของคิว
 โครงสรางข
อมู
้
้ ลแบบคิวเป็ นโครงสราง
้
เชิงเส้นและไมเชิ
่ งเส้น
 มีทางเขาและออก
2 ทาง
้
 มีการทางานแบบลาดับ
 สามารถนาขอมู
าขอมู
้ ลเขาและน
้
้ ลออก
สลับกันได้
 มีลาดับการทางานแบบเขาก
อน
้ อนออกก
่
่
(FIFO)
ประเภทของคิว มี 3 ปรเภท
 คิวธรรมดา
(Queue)
 คิววงกลม (Circular Queue)
 คิวทีเ่ รียงลาดับตามความสาคัญ
(Priority Queue)
การดาเนินการของคิว
เมือ
่ นาเขาข
ดเรียง
้ อมู
้ ลจะตองจั
้
ในลักษณะการตอท
น
่ ายกั
้
่ ยูส
 ขอมู
บขอมู
้
่ ่ วนทายของการเก็
้ ลทีอ
้ ล
เรียกวา่
Rear
 ขอมู
่ ยูส
้ ลทีอ
่ ่ วนหัวของการเก็บขอมู
้ ล
ซึง่ จะเรียกวา่
Front
 การนาขอมู
ว
เรียกวา่
้ ลเขาไปในคิ
้
Insert (Enqueue)
คิวธรรมดา (Queue)
Front
Rear
คิวธรรมดา (Queue)
 คิวธรรมดา
หมายถึง คิวทีม
่ ก
ี ารนา
ขอมู
ายคิ
ว (Rear) และนา
้ ลเขาทางท
้
้
ขอมู
้ ลออกหางคิว (Front) โดยถ้าทาย
้
คิวไปอยูที
่ าแหน่งทายสุ
ดของคิวแลว
่ ต
้
้
ถึงแมจะมี
ช่องวางเหลื
อทีห
่ วั คิวก็ไม่
้
่
สามารถนาขอมู
บได้ จนกวา่
้ ลใหมไปเก็
่
จะนาขอมู
งเริม
่
้ ลในคิวออกให้หมดกอนจึ
่
นาขอมู
บได้
้ ลใหมไปเก็
่
การนาขอมู
้ ลเขา้ Enqueue
 กอนน
าสมาชิกเขาคิ
่
้ ว
ต้องตรวจสอบวาคิ
่ วเต็ม
หรือไม่ โดยที่ ถ้า rear = maxQ แสดงวา่
คิวเต็ม (เมือ
่ maxQ คือขนาดของคิว)
 การนาขอมู
จะเพิม
่ เขามา
้ ลใหมเข
่ ามาแถวคอย
้
้
ดานหลั
ง
้
 และจะนาเขามาเรื
อ
่ ย ๆ จนเต็ม หรือเรียกวา่
้
แถวคอยเต็ม (Queue Overflow)
 ดังนั้นการนาสมาชิกเขาคิ
่
้ ว จึง เป็ นการเพิม
ค่าพอยน์เตอร์ rear
 หากมีสมาชิกในคิวเพียงคาเดียวพอยนเตอร
การนาข้อมูลเข้า Enqueue
Queue Overflow
1
10
2
3
4
20
30
40
R
R
F=R=0
F
R
R
โครงสร้ างของการแทนคิวด้ วยอาร์ เรย์
1
2
3
4
5
A
B
C
D
E
Fro
nt
Re
ar
Front = 1
Rear =5
6
7
8
พืน
้ ที่
วาง
่
9
Ma
10
x
การนาขอมู
้ ลเขา้ Enqueue
1
2
A B
F=R=0
FR R
3
4
5
6
C
D
E
R
R
R
Front =1
Rear =1
0
H
9
I
Ma
10
x
J
R
R
R
7
F
G
8
R
R
Queue Overflow
Queue : Array Implementation

INSERT-Q Algorithm ตรวจสอบวาคิวเต็มหรือไม
่
่
front = rear = 0
if( rear == maxQ)
ตรวจสอบวาคิ
ววางเปล
า่
่
่
write “Overflow”
หรือไม่
else
ถ้า front = 0 แสดงวาคิ
ววาง
่
่
if(front==0)
เปลา่ นั่นคือยังไมมี
ลใน
ขอมู
่
้
front ← 1
คิว
rear ← 1
Q[rear] ← Item
หมายเหตุ
else
Q คือชือ
่ คิว
rear ← rear + 1 maxQ คือขนาดของ
Q[rear] ← Item คิว
Item คือขอมู
้ ลที่
Queue : Array Implementation

การนาสมาชิกเขาคิ
้ ว (enqueue)
Empty
queue
front = rear
=Enqueue(A
0
) A
front
rea
r
Enqueue(B
)
front
A
B
rea
r
Queue : Array
Implementation
 การนาสมาชิกเขาคิ
้ ว
Enqueue
(C)
A
B
front
Enqueue
(D)
A
B
(enqueue) (ตอ)
่
C
rea
r
C
front
Enqueue
(E)
Error : Overflow
D
rea
r
การนาขอมู
้ ลออก
Dequeue
 กอนน
าสมาชิกออกจากคิว
่
ต้องตรวจสอบ
ดูกอนว
าคิ
าหรื
อไม่ โดยเงือ
่ นไขการ
่
่ ววางเปล
่
่
ตรวจสอบคือ front = rear = 0
 ข้อมูลทีจ
่ ะนาออกกอนจะเป็
นขอมู
่ ยู่
่
้ ลทีอ
ดานหน
้
้า
 สามารถนาขอมู
่ ย ๆ จนไมมี
้ ลออกเรือ
่ ขอมู
้ ล
หรือเรียกวา่ แถวคอยวาง
(Queue
่
Underflow)
 ดังนั้นการนาสมาชิกออกจากคิวจึง เป็ นการ
เพิม
่ ค่าพอยน์เตอร์ front
การนาขอมู
้ ลออก
1
2
A B
F=R=0
F
F
Dequeue
3
4
5
6
C
D
E
F
F
F
Front =10
1
Rear =
0
9
Ma
10
x
J
7
F
G
8
H
I
F
F
F
F FR
Queue Underflow
การนาขอมู
้ ลออก
Dequeue
1
2
3
4
10
20
30
40
F=R=0
F
F
Queue Underflow
F
F R
Queue : Array
Implementation

Remove-Q algorithm
ตรวจสอบวาคิววางเปลา
่
่
่
ตรวจสอบว
ามี
่ ่ขอมู
้ ลในคิวเพียง
หรือไม
if( rear == 0)
คาเดี
่ ยวหรือไม่ ซึง่ ถา้ front =
write “Underflow” rear แสดงวามี
่ ขอมู
้ ลในคิวเพียง
คาเดี
่ ตองการลบข
อมู
else
่ ยว เมือ
้
้ ล
ออกจะทาให้ไมเหลื
อขอมู
if(front==rear)
่
้ ลใด
front ← 0 ๆ ในคิว จึงทาการกาหนดให้
่ น
rear ← 0 คา่ front และ rear มีคาเป็
0 ซึง่ เป็ นการแสดงให้เห็ นวา่
else
คิววางเปล
า่
่
front ← front + 1
Queue : Array
Implementation
 การนาสมาชิกออกจากคิว
A
B
C
D
rea
r
front
dequeue
B
C
front
dequeue
D
rea
r
C
fro
D
rea
(dequeue)
Queue : Array
Implementation

การนาสมาชิกออกจากคิว (dequeue) (ตอ)
่
dequeue
D
dequeue
fron
t
front = rear
=0
dequeue
Error : Underflow
rea
r
คิววงกลม (Circular Queue)
 คิววงกลม
หมายถึง คิวทีถ
่ ูก
ออกแบบมาให้มีลก
ั ษณะเป็ นวงกลม
เพือ
่ ให้สามารถนาขอมู
บไว้
้ ลใหมไปเก็
่
ทีช
่ ่ องวางด
านหน
่
้
้ าคิวได้ คิววงกลม
ออกแบบมาเพือ
่ แกปั
้ ญหาคิวธรรมดา
คิววงกลม (Circular Queue)
 ลักษณะของคิวแบบวงกลม
 เหมือนคิวธรรมดาคือมีตว
ั ชี้ 2 ตัว
คือ front และ rear สาหรับ
แสดงตาแหน่งหัวคิวและทายคิ
ว
้
ตามลาดับ
 แตกตางจากคิ
วธรรมดาคือ คิว
่
ธรรมดาเมือ
่ rear ชีอ
้ ยูที
่ าแหน่ง
่ ต
สุดทายของคิ
ว จะทาให้ไมสามารถ
้
่
เพิม
่ ขอมูลเขาไปในคิวไดอีก ทัง้ ที่
Circular Queue
ลักษณะของคิวแบบวงกลม
(ตอ)
่
 คิววงกลมจัดการปัญหานี้โดย กรณี
rear ชีอ
้ ยูที
่ าแหน่งสุดทายของคิ
ว
่ ต
้
การเพิม
่ ขอมู
ถาหากมี
่
้ ล คาของ
้
rear จะสามารถวนกลับมาชีย
้ งั
ตาแหน่งแรกสุดของคิวได้
 ดังนั้นคิววงกลมจะสามารถเพิม
่
Circular Queue
 การนาขอมู
้ ลเขาคิ
้ ววงกลม
D
E
fron rea
t
r
Enqueue(A
D
E
)A
rea
front
r
Enqueue(B
D
)A B
rea
front
E
Circular Queue
 การนาสมาชิกออกจากคิววงกลม
A
B
D
E
rea fron
r
t
Dequeue
A
B
rea
r
Dequeue
A
B
fron rea
E
front
Circular
Queue
front=1
F
G
H
I
J
rear=5
rear=12
Circular
Queue
Enqueue
front=1
O
P
Q
F
G
N
Queue is Full
M
L
rear=7
H
I
K
J
rear=6 rear=5
rear=12
Circular
Queue
front=1
O
Dequeue
P
Q
front=2
F
N
G
M
H
L
I
K
J
2 rooms available
front=3
rear=12
Circular
Queue
rear=1
O
Enqueue
N
P
Q
Queue is
Full
M
L
K
J
rear=2
R
S
H
I
front=3
Array Implementation
J
F
G
H
I
rear=1
front=4
subprogram enqueue (datatype
newdata)
1. rear  rear+1
2. if (rear == maxq)
2.1 rear  1
3. return
Array Implementation
J
rear=1
F
G
H
I
front=4
subprogram dequeue (datatype
olddata)
1. front  front+1
2. if (front == maxq)
2.1 front  1
3. return
คิวลาดับความสาคัญ หรือ
แถวคอยเชิงบุรม
ิ ภาพ
(Priority Queue)
บางครัง้ เราพบวา่ การเขารั
้ บบริการ ไม่
เป็ นไปตามกฎของคิว
เนื่องจากไดรั
้ บ
อภิสิทธิ ์ (priority) ให้สามารถเขารั
้ บ
บริการกอนได
ลูกคาประจ
าจะ
่
้ เช่น
้
ไดรั
ถึงแมจะเข
ามาที
้ บการบริการกอน
่
้
้
หลังลูกคาจรคนอื
น
่ ทีค
่ อยอยูก็
หรือ
้
่ ตาม
ในรานถ
ายเอกสาร
ถาพนั
กงานกาลังถาย
้
่
้
่
เอกสารให้ลูกคาคนหนึ
่งจานวน 100
้
หนา แลวมีลก
ู คาใหมมาขอถายเพียงแค
คิวลาดับความสาคัญ หรือ
แถวคอยเชิงบุรม
ิ ภาพ
(Priority Queue)
 ใน
คิวธรรมดา ข้อมูลทีเ่ ขามาก
อนจะมี
สิทธิ ์
้
่
ออกกอน
(First In First Out:FIFO) อยางไร
่
่
ก็ตาม มีบางครัง้ ทีเ่ ราตองยกให
้
้สมาชิกบาง
ประเภทไดท
ง้ ทีม
่ าทีหลัง เช่น
้ างานกอนทั
่
การให้คิวงานทีเ่ ล็กกวาได
ท
หรือ การ
่
้ ากอน
่
ให้สิ ทธิพเิ ศษแกการท
างานบางประเภท
่
 คิวลาดับความสาคัญทาให้เราสามารถ
ประยุกตใช
ึ้ เนื่องจากเพิม
่ การให้
์ ้คิวไดดี
้ ขน
ความสาคัญของสมาชิกทีแ
่ ตกตางกั
น ส่งผล
่
คิวลาดับความสาคัญ หรือ
แถวคอยเชิงบุรม
ิ ภาพ
(Priority Queue)
Priority Queue
ในการทางานกับคิวแบบนี้ ตองมี
คา่
้
อภิสิทธิข
์ องแตละสมาชิ
กเก็บไวด
เพือ
่
่
้ วย
้
ใช้หาตาแหน่งทีอ
่ ยูก
่ ี
่ อนหน
่
้ าสมาชิกทีม
อภิสิทธิต
์ า่ กวาและตามหลั
งสมาชิกทีม
่ ี
่
อภิสิทธิเ์ ทากั
่ นหรือสูงกวา่

typedef struct { int priority;
char data;
} Queue;
Priority Queue
1
2
3
4
5
1
1
2
3
3
A
Z
C
D
M
front = 1
6
rear = 5
7
...
Priority Queue
1
2
3
4
5
1
1
2
3
3
A
Z
C
D
M
front = 1
6
7
...
rear = 5
ตองการแทรก
W ทีม
่ อ
ี ภิสิทธิเ์ ทากั
้
่ บ
Priority Queue
1
2
3
4
5
6
1
1
2
2
3
3
A
Z
C
W
D
M
front = 1
7
...
rear = 6
หลังแทรก W ทีม
่ อ
ี ภิสิทธิเ์ ทากั
่ บ 2
แบบฝึ กหัด Queue
 คิว
(Queue) หมายถึงอะไร
 คิวมีลก
ั ษณะทีส
่ าคัญอยางไร
่
 คิวแบงออกเป็
นกีป
่ ระเภท อะไรบาง
่
้
 คิววงกลมมีลก
ั ษณะอยางไร
่
แบบฝึ กหัด Queue

่ จ
ี านวนช่องเก็บขอมู
ให้พิจารณาคิววงกลม ทีม
้ ล 5
ช่อง ซึ่งมีข้อมูลจัดเก็บ เป็ นดังนี้
A
1
R
2
Front
E
3
4
Rear
จงวาดรูปของคิวตามการดาเนินการตามลาดับ
ดังตอไปนี
้
่
 J เขามาในคิ
ว
้
 นาขอมู
้ ลออกจากคิว
 นาขอมู
้ ลออกจากคิว
 K เขามาในคิ
ว
้
5