โครงสร้างข้อมูลแบบคิว
Download
Report
Transcript โครงสร้างข้อมูลแบบคิว
โครงสร้างข้อมูลแบบคิว
เนื้อหา
คิว
โอเปอร์เรชัน่ ของคิว
Queue
การเพิ่มข้อมูลเข้าไปในคิว (enqueue)
การนาข้อมูลออกจากคิว (dequeue)
คิวแบบวงกลม
การประยุกต์ใช้งานคิว
Slide# 2
คิว : Queue
คิวคือโครงสร้างข้อมูลที่ประกอบด้วยสมาชิกที่เรียงติดต่อกันเป็ นแถว
เมื่อมีสมาชิกใหม่เข้าไปเสริมในคิวจะต้องเสริมจากทางด้านหลัง (rear)
กรณีที่นาสมาชิกออกจากคิวจะต้องนาออกจากด้านหน้า (front)
คิวเป็ นลิสต์แบบเชิงเส้น เช่นเดียวกับสแตก แต่มีความแตกต่างกันตรงที่คิว
มีตวั ชี้ 2 ตัว คือ front และ rear สาหรับการใส่ขอ้ มูลเข้าและนาข้อมูลออก
ดังนั้น คิวจึงมีกระบวนการทางานแบบ First In First Out : FIFO หรือ
First Come First Server : FCFS
ตัวอย่างของคิว
A
B
C
ก่อน(front)
หลัง(rear)
นาออก (dequeue)
B
front
C
B
C
front
rear
D
rear
นาเข้า
(enqueue)
สถานะของคิว
0
1
2
front = -1
rear =-1
front = 0
rear = 0
front = 0
rear = 1
1
A
B
2
front = 1
rear = 1
c) enqueue B
0
front = 1
rear = 2
1
2
B
C
e) enqueue C
1
2
A
b) enqueue A
a) empty queue
0
0
0
1
2
B
d) dequeue A
0
front = 2
rear = 2
Queue
Overflow
1
2
C
f) dequeue B
โอเปอร์เรชั ่นของคิว
การเพิ่มข้อมูลเข้าไปในคิว :Enqueue
การนาข้อมูลออกจากคิว : Dequeue
โดยใช้การสร้างคิวด้วยโครงสร้างอาร์เรย์
การเพิ่มข้อมูลเข้าไปในคิว Enqueue
ก่อนทาการ enqueue เพือ่ เพิม่ ข้อมูลเข้าที่ตาแหน่ ง rear จะมีการตรวจสอบ
ก่อนว่าคิวเต็มหรือไม่
โดยตรวจสอบจากค่า rear = MAX หรือ rear = MAX-1 หรือไม่
ถ้าคิวเต็มแล้ว ให้แสดงข้อความเตือนว่าคิวเต็ม
ถ้ายังไม่เต็มให้ทาการเพิ่มข้อมูลเข้าไปในคิว
และเพิ่มค่า rear ทีละ 1 ก่อนจะนาสมาชิกใหม่เข้ามา และทาลักษณะเช่นนี้ จน
กว่าคิวจะเต็ม
แสดงการ enqueue
0
1
N
2
…
front = rear = -1
enq (que, 7);
enq (que, 3);
enq (que, 9);
0
1
…
7
front = rear = 0
0
1
2
7
3
front = 0
0
rear = 1
1
2
7
3
9
front = 0
N
2
rear = 2
N
…
N
…
Enqueue
addq ( int data )
{ if ( rear == MAX-1 )
{
printf ( "\nQueue is full" );
return;
}
else rear++ ;
arr[rear] = data;
if ( front == -1 )
front = 0;
}
Algorithm
1. ตรวจสอบว่า Queue เต็ม ? ( Rear
= N)
- ถ้า Queue เต็ม ให้แสดง
ข้อความว่า "Queue Overflow" แล้ว
เลิกงาน
- ถ้า Queue ไม่เต็ม ให้ทางานข้อ
ที่ 2 และ 3
2. ให้เพิ่มค่าของ Rear อีก 1
3. ใส่ขอ้ มูลลงใน Queue ในตาแหน่ ง
ของตัวแปร Rear
การนาข้อมูลออกจากคิว Dequeue
Queue
ก่อนทาการ dequeue เพื่อนาข้อมูลออกที่ตาแหน่ ง font จะมีการ
ตรวจสอบก่อนว่าคิวว่างหรือไม่
โดยตรวจสอบจาก font = rear = -1 หรือไม่
ถ้าคิวว่าง ให้แสดงข้อความเตือนว่าคิวว่าง
ถ้ายังไม่วา่ ง(แสดงว่ามีขอ้ มูล)ให้ทาการนาข้อมูล ณ ตาแหน่ งที่ font ชี้ อยูอ่ อก
จากคิว และเพิ่มค่า front ขึ้ นทีละ 1 ทุกครั้งหลังจากนาข้อมูลออกจากคิวแล้ว
ทาจนกระทัง่ front = rear โดยกาหนดให้คา่ ของ front=-1 และ
rear=-1 ซึ่งแสดงว่าคิวว่าง
Slide# 11
แสดงการ dequeue
1
2
7
3
9
…
0
rear = 2
1
2
front = 0
deq (que,data );
deq (que, data);
3
0
front = 1
1
9
N
…
rear = 2
2
9
0
N
10
11
rear = 4
font = 2
1
2
N
…
deq (que, data);
Queue
N
0
font = rear = -1
Slide# 12
Dequeue
delq( )
{ int data ;
if ( front == -1 )
{
printf ( "\nQueue is Empty" ) ;
return NULL ;
}
data = arr[front] ;
if ( front == rear )
front = rear = -1 ;
กรณีลบคิวที่เหลือเพียงตัวเดียว
else
front++ ;
return data ;
}
Queue
Slide# 13
Algorithm
1. ตรวจสอบว่า Queue ว่าง ? (โดยการ
ตรวจสอบว่า Front = Rear)
- ถ้า Queue ว่าง ให้แสดงข้อความ
ว่า "Queue Empty" แล้วเลิกงาน
- ถ้า Queue ยังมีขอ้ มูล ให้ทางาน
ข้อที่ 2 และ 3
2. เพิม่ ค่าของตัวแปร Front
3. ให้นาข้อมูลในตาแหน่งที่ Front ออก
จาก Queue
คิววงกลม : Circular Queue
เป็ นการออกแบบมาเพื่อใช้ในการแก้ปัญหาในกรณีที่ยงั มีพนที
ื้ ่เหลือในการเก็บ
ข้อมูล คิววงกลมสามารถกลับไปใช้คิวหน้าได้ในกรณีที่หมดคิวปกติแล้ว
คิววงกลม : Circular Queue
4
rear
E
5
D
F
0
B
3
C
2
1
front
คิวแบบวงกลม
0
1
2
3
C
“queue overflow”
front = 3
rear = 3
enqueue (D)
0
กรณีคิวเต็ม กาหนดให้ rear ไปชี้ ที่
1
2
3
D
C
rear = 0
front = 3
จุดเริ่มต้นใหม่ (0) เพื่อสามารถเพิม่ D
เข้าไปได้
เพิ่มข้อมูลในคิวแบบวงกลม
enqueue (E)
enqueue (F)
0
1
2
3
D
E
C
rear = 1
front = 3
0
1
2
3
D
E
F
C
rear = 2
front = 3
Algorithm Insert
1. ตรวจสอบว่าคิวเต็ม ? (
ตาแหน่งต่อไปของ Rear = Front ? )
- ถ้าคิวเต็มให้แสดงข้อความว่า
"Queue Overflow" แล้วเลิกการทางาน
2. เลื่อน Rear ไปคิวต่อไป
3. นาข้อมูลใส่ลงในคิว
4. ตรวจสอบว่า Front เป็ น -1
หรือไม่ (กรณีทเ่ี ป็ นการใส่ขอ้ มูลเป็ นตัว
แรกของคิว)
- ถ้าใช่ ให้ Front = 0 (
Front รอทีต่ าแหน่งแรกของข้อมูลในคิว)
Enqueue of Circular Queue
addq ( int item )
{ if ( ( rear == MAX - 1 && front == 0 ) || ( rear + 1 == front ) )
{
printf ( "\nQueue is full" ) ;
return ;
}
if ( rear == MAX - 1 )
แสดงข้อความว่า “คิวเต็ม”
rear = 0 ;
else
rear++ ;
arr[rear] = item ;
เมื่อต้องการเพิ่มข้อมูลเข้าไปอีก ให้กาหนด rear ไปชี้ ที่
if ( front == -1 )
จุดเริ่มต้นใหม่
front = 0 ;
}
ลบข้อมูลในคิวแบบวงกลม
enq (que,C);
0
1
2
3
D
E
F
C
0
deq (que,data );
D
front 0
0
deq (que,data );
rear = 2 front = 3
1
2
3
E
F
rear = 2
1
2
E
front = 1
3
F
rear = 2
Algorithm Delete
1. ตรวจสอบว่าคิวว่างหรือไม่ ?
(Front = -1 ? )
2. นาข้อมูลออกจากคิว
3. ตรวจสอบว่าเป็ นข้อมูลตัวสุดท้าย
ของคิวหรือไม่ (Front = Rear ? )
- ถ้าใช่ ให้ Front และ Rear
เป็ น -1 (กาหนดให้ไม่มขี อ้ มูลในคิวเลย)
- ถ้าไม่ใช่ ให้เลื่อน Front ไปรอ
ในคิวต่อไป
Dequeue of Circular Queue
delq( )
{ int data ;
if ( front == -1 )
{
printf ( "\nQueue is Empty" ) ;
return NULL ;
}
else
{
data = arr[front] ;
if ( front == rear )
front = rear = -1 ;
else
{ if ( front == MAX - 1 )
front = 0 ;
else
front++ ;
}
}
return data ;
}
ลบคิวที่เหลือเพียงตัวเดียว
ลบคิวที่ช่องความจาสุดท้าย กาหนดให้ front วนไปชี้
ที่จุดเริ่มต้นใหม่
คิวลาดับความสาคัญ หรือ แถวคอยเชิงบุริมภาพ
(Priority Queue)
ในคิวปกติ ข้อมูลที่เข้ามาก่อนจะมีสิทธิ์ออกก่อน (First In First Out:FIFO)
อย่างไรก็ตาม มีบางครั้งที่เราต้องยกให้สมาชิกบางประเภทได้ทางานก่อนทั้งที่
มาทีหลัง เช่นการให้คิวงานที่เล็กกว่าได้ทาก่อน หรือ การให้สิทธิพิเศษแก่การ
ทางานบางประเภท
คิวลาดับความสาคัญทาให้เราสามารถประยุกต์ใช้คิวได้ดีขึ้น เนื่ องจากเพิ่มการให้
ความสาคัญของสมาชิกที่แตกต่างกัน ส่งผลให้เราสามารถจัดเรียงคิวได้ใหม่ให้
เหมาะสมกับการทางานได้ เราใช้คิวลาดับความสาคัญในการจัดการทางาน การ
ตรวจนับ
คิวลาดับความสาคัญ หรือ แถวคอยเชิงบุริมภาพ
(Priority Queue)
แบบฝึ กหัด
1. จงอธิบายถึงสิ่งที่เหมือนกัน และสิ่งที่แตกต่างกันระหว่าง สแตก กับ คิว
2. จงอธิบายถึงสิ่งที่เหมือนกัน และสิ่งที่แตกต่างกันระหว่าง คิวเส้นตรง กับ คิว
วงกลม
3. จงเขียนแผนภาพการดาเนิ นการตามขั้นตอนซึ่งมีขอ้ มูลในคิววงกลมดังนี้
Q
4
0
-5
10
front
rear
การดาเนิ นการ 1. deq (Q,x)
2. enq (Q,2)
3. deg (Q,x)
4. deq (Q,x)
5. enq (Q,-3)
6. deq (Q,x)
แบบฝึ กหัด (ต่อ)
4. คิวขนาด 7 ค่า มีรายการต่อไปนี้
front = 2 , rear = 5
Queue[] = {null, null, “ขนุ น”, “ส้มโอ”,”แตงโม”, “ฝรัง่ ”, null}
จงแสดงผลของคิวแบบวงกลม โดยมีค่าเริ่มต้นตาแหน่ งที่ 0 รวมทั้ง
front และ rear เมื่อมีการกระทาต่อไปนี้
ก. เพิ่ม “มะม่วง”
ข. นา 2 รายการออกจากคิว
ค. เพิ่ม “ทุเรียน”
ง.เพิ่ม “องุ่น”
จ. นา 2 รายการออกจากคิว ฉ. เพิ่ม “ละมุด”
แบบฝึ กหัด (ต่อ)
5.
จงยกตัวอย่าง การใช้คิวในชีวิตประจาวัน หรือในระบบคอมพิวเตอร์
มา 5 ตัวอย่าง