- มีลักษณะคล้ายกับสแตก คือ ข้อมูลในคิวจัดเรียงกันอย่างมีลำดับเช่นเดียวกับสแตก แต่ต่างกันตรงที่คิวแยกทางเข้าและออกของข้อมูลไว้คนละส่วนกัน
- ข้อมูลที่นำเข้าไปเก็บก่อนจะถูกนำออกมาทำงานก่อน ส่วนข้อมูลที่เข้าไปเก็บทีหลังก็จะถูกนำออกมาใช้งานทีหลัง
- มีคุณสมบัติที่เรียกว่า FIFO (First-In-First-Out)
- มีขั้นตอนที่ซับซ้อนกว่าสแตก เนื่องจากต้องจัดการกับตัวชี้ front และ rear ให้ถูกต้อง
- ตัวชี้ Front ชี้ไปที่สมาชิกตัวแรก และตัวชี้ Rear ชี้ไปที่สมาชิกตัวสุดท้ายของคิว โดยที่เวลาข้อมูลจะเข้าสู่คิวจะเข้าทาง R ส่วนเวลาที่ข้อมูลจะออกจากคิวจะออกทาง F
การเพิ่มข้อมูลในคิว (Enqueue)
การเพิ่มข้อมูลในคิว ข้อมูลจะถูกเพิ่มเข้ามาทางด้าน Rear ของคิว
ขั้นตอนการเพิ่มข้อมูลลงในคิว
- ตรวจสอบว่าคิวเต็มหรือไม่ กรณีเกิดคิวเต็มค่าของ Rear จะเท่ากับขนาดสูงสุดของตัวแปรอาร์เรย์ ถ้าคิวเต็มควรแจ้งด้วยว่า คิวเต็ม ไม่สามารถเพิ่มข้อมูลได้
- การนำข้อมูลเข้าสู่คิว จะไม่สามารถนำเข้าในขณะที่คิวเต็มหรือไม่มีที่ว่าง ถ้าพยายามจะทำจะเกิด error ที่เรียกว่า overflow
- ถ้าคิวยังว่างอยู่ ให้ขยับ Rear ไปที่ตำแหน่งถัดไป 1 ตำแหน่ง
- นำข้อมูลที่ต้องการเพิ่มมาเก็บไว้ ณ ตำแหน่งใหม่ของ Rear
- ถ้าข้อมูลที่เพิ่มเข้าไปเป็นค่าเดียวในคิว ให้ขยับ Front มาอยู่ตำแหน่งเดียวกันกับ Rear นั่นคือ Front = 1
Algorithm QINSERT(Q,Y)
This Algorithm is to insert the item into queue
Pre Q is a queue structure that has N size
Y is an item to insert into queue
Post Y is inserted into queue
if (R = N) then
print “QUEUE FULL”
else
set R to R + 1 /* ให้ R ชี้ไปยังที่ว่างถัดไป */
set Q[R] to Y /* นำข้อมูล Y เข้าสู่คิว */
if (F = 0) then /* ถ้า Y เป็นค่าเดียวในคิว */
set F to 1 /* F และ R ชี้ไปยังค่าเดียวกัน */
set R to 1 endif
endif
End QINSERT
การดึงข้อมูลจากคิว (Dequeue)
ข้อมูลจะถูกดึงออกจากคิวผ่านทาง Front กรณีถ้าข้อมูลอยู่ภายในคิวมีเพียงตัวเดียว ค่า Front จะมีค่าเท่ากับ Rear
ขั้นตอนการดึงข้อมูลจากคิว
- ตรวจสอบดูก่อนว่า คิวว่างหรือไม่ ถ้าคิวว่างให้แจ้งออกมาว่า คิวว่าง ดึงข้อมูลไม่ได้
- การนำข้อมูลออกจากคิว จะไม่สามารถนำอะไรออกจากคิวที่ว่างเปล่า ถ้าพยายามจะทำจะเกิด error ที่เรียกว่า underflow
- ถ้าคิวไม่ว่าง ให้ดึงข้อมูลที่ Front ออกมาเก็บไว้ในตัวแปร (ก็คือ ตัวข้อมูลที่ดึงออกมาได้)
- ตรวจสอบดูว่า ข้อมูลที่ถูกดึงออกมาเป็นข้อมูลตัวสุดท้ายในคิวหรือไม่ นั่นคือ ดูว่า Front = Rear หรือไม่
- ถ้า Front = Rear นั่นคือ ข้อมูลที่ดึงออกมาเป็นข้อมูลตัวสุดท้าย ฉะนั้นตอนนี้คิวว่างแล้ว วิธีการบอกว่าคิวว่างก็คือ Front = Rear = 0
- ถ้า Front != Rear คือ คิวไม่ว่าง ก็ให้ขยับ Front ขึ้นไปอีก 1 ขั้น
Algorithm QDelete(Q)
This Algorithm is to delete the item from queue
Pre Q is a queue structure that has N size
Post X is an item returned
if (F = 0) then
print “QUEUE EMPTY”
else
set X to Q[F] /* นำค่าแถวหน้าออกจากคิวเก็บไว้ใน X */
if (F = R) THEN /* ถ้า ในคิวมีค่าเดียว */
set F to 0 /* คิวว่าง */
set R to 0 else
set F to F + 1 /* ให้ F ชี้ไปยังค่าหน้าแถวคิวถัดไป */
endif
endif
End QDelete
การตรวจสอบคิวว่าง (Empty)
การตรวจสอบว่าคิวว่างหรือไม่นั้น เป็นงานประจำที่จะต้องทำเมื่อต้องการดึงข้อมูลออกจากคิว ซึ่งมีหลักการในการพิจารณาง่ายๆ คือ กรณีที่จะเกิดคิวว่างได้ก็ต่อเมื่อ Front = Rear = 0 เท่านั้น
Algorithm EmptyQ(Q)
Pre Q is a queue structure
Post boolean returned
if (F = 0) and (R = 0) then
set empty to True
else
set empty to False
endif
End EmptyQ
การตรวจสอบคิวเต็ม (Full)
การตรวจสอบว่าคิวเต็มหรือไม่นั้น เป็นการดำเนินการที่จำเป็นต้องทำเสมอเมื่อต้องการที่จะเพิ่มข้อมูลเข้าไปในคิว ซึ่งมีหลักการในการพิจารณาคือ กรณีเกิดคิวเต็มค่าของ Rear จะมีค่าเท่ากับความจุของคิวนั้น
Algorithm FullQ(Q)
Pre Q is a queue structure
Post boolean returned
if (R = Max) then
set full to True
else
set full to False
endif
End FullQ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น