คิว
Queue
ลักษณะโครงสร้างข้อมูลแบบคิว (Queue)
มีลักษณะคล้ายกับสแตก คือ
ข้อมูลในคิวจัดเรียงกันอย่างมีลำดับเช่นเดียวกับสแตก
แต่ต่างกันตรงที่คิวแยกทางเข้าและออกของข้อมูลไว้คนละส่วนกัน
ข้อมูลที่นำเข้าไปเก็บก่อนจะถูกนำออกมาทำงานก่อน
ส่วนข้อมูลที่เข้าไปเก็บทีหลังก็จะถูกนำออกมาใช้งานทีหลัง คุณสมบัติที่เรียกว่า FIFO (First-In-First-Out)ขั้นตอนที่ซับซ้อนกว่าสแตก เนื่องจากต้องจัดการกับตัวชี้ front
และ rear ให้ถูกต้องตัวชี้ Front ชี้ไปที่สมาชิกตัวแรก และตัวชี้ Rear ชี้ไปที่สมาชิกตัวสุดท้ายของคิว
โดยที่เวลาข้อมูลจะเข้าสู่คิวจะเข้าทาง R ส่วนเวลาที่ข้อมูลจะออกจากคิวออกทาง
F
การแทนข้อมูลของคิว
การดำเนินการกับคิว
➧การเพิ่มข้อมูลในคิว (Enqueue)
➧การดึงข้อมูลจากคิว (Dequeue)
➧การตรวจสอบคิวว่าง (Empty)
➧การตรวจสอบคิวเต็ม (Full)
การเพิ่มข้อมูลในคิว (Enqueue)
การเพิ่มข้อมูลในคิว ข้อมูลจะถูกเพิ่มเข้ามาทางด้าน Rear
ของคิว
ขั้นตอนการเพิ่มข้อมูลลงในคิว
ตรวจสอบว่าคิวเต็มหรือไม่
กรณีเกิดคิวเต็มค่าของ Rear
จะเท่ากับขนาดสูงสุดของตัวแปรอาร์เรย์ถ้าคิวเต็มควรแจ้งด้วยว่า
คิวเต็ม ไม่สามารถเพิ่มข้อมูลได้
การนำข้อมูลเข้าสู่คิวจะไม่สามารถนำเข้าในขณะที่คิวเต็มหรือไม่มีที่ว่าง
ถ้าพยายามจะทำจะเกิด errorเรียกว่า overflow
ถ้าคิวยังว่างอยู่ ให้ขยับ Rear ไปที่ตำแหน่งถัดไป
1 ตำแหน่ง
นำข้อมูลที่ต้องการเพิ่มมาเก็บไว้ ณ ตำแหน่งใหม่ของ Rear
ถ้าข้อมูลที่เพิ่มเข้าไปเป็นค่าเดียวในคิว
ให้ขยับ Front
มาอยู่ตำแหน่งเดียวกันกับ Rear นั่นคือ Front
= 1
การดึงข้อมูลจากคิว
(Dequeue)
🔜 ข้อมูลจะถูกดึงออกจากคิวผ่านทาง
Front กรณีถ้าข้อมูลอยู่ภายในคิวมีเพียงตัวเดียว ค่า Front
จะมีค่าเท่ากับ Rear
🔜ขั้นตอนการดึงข้อมูลจากคิว
🔜ตรวจสอบดูก่อนว่า
คิวว่างหรือไม่ ถ้าคิวว่างให้แจ้งออกมาว่า คิวว่าง ดึงข้อมูลไม่ได้
🔜การนำข้อมูลออกจากคิว
จะไม่สามารถนำอะไรออกจากคิวที่ว่างเปล่า ถ้าพยายามจะทำจะเกิด error ที่เรียกว่า
underflow
🔜ถ้าคิวไม่ว่าง
ให้ดึงข้อมูลที่ Front
ออกมาเก็บไว้ในตัวแปร (ก็คือ ตัวข้อมูลที่ดึงออกมาได้)
🔜ตรวจสอบดูว่า ข้อมูลที่ถูกดึงออกมาเป็นข้อมูลตัวสุดท้ายในคิวหรือไม่
นั่นคือ ดูว่า Front
= Rear หรือไม่
🔜 ถ้า Front
= Rear นั่นคือ ข้อมูลที่ดึงออกมาเป็นข้อมูลตัวสุดท้าย
ฉะนั้นตอนนี้คิวว่างแล้ว วิธีการบอกว่าคิวว่างก็คือ Front = Rear = 0
🔜ถ้า Front != Rear คือ คิวไม่ว่าง ก็ให้ขยับ Front ขึ้นไปอีก 1 ขั้น
การตรวจสอบคิวว่าง (Empty)
การตรวจสอบว่าคิวว่างหรือไม่นั้น
เป็นงานประจำที่จะต้องทำเมื่อต้องการดึงข้อมูลออกจากคิว
ซึ่งมีหลักการในการพิจารณาง่ายๆ คือ กรณีที่จะเกิดคิวว่างได้ก็ต่อเมื่อ Front
= Rear = 0 เท่านั้น
การตรวจสอบคิวเต็ม (Full)
การตรวจสอบว่าคิวเต็มหรือไม่นั้น
เป็นการดำเนินการที่จำเป็นต้องทำเสมอเมื่อต้องการที่จะเพิ่มข้อมูลเข้าไปในคิวซึ่งมีหลักการในการพิจารณาคือกรณีเกิดคิวเต็มค่าของ
Rearจะมีค่าเท่ากับความจุของคิวนั้น
คิวว่าง (Empty) และคิวเต็ม (Full)
คิววงกลม (Circular Queue)
⦽คิววงกลม
เป็นคิวที่คิดค้นขึ้นมาเพื่อแก้ปัญหาที่เกิดขึ้นกับคิวปกติ
จึงถือได้ว่ามีประสิทธิภาพดีกว่า แต่ก็จะมีความซับซ้อนขึ้นมาอีกหน่อย
⦽ลักษณะของคิววงกลม คือ
การมองภาพตัวแปรอาร์เรย์ที่ใช้แทนคิวให้เป็นวงกลม นั่นคือ ให้ถือว่าด้านหน้า (Front) ของคิวตำแหน่งต่อจากด้านหลังของคิว (Rear) เสมือนรูปวงกลม
⦽ในคิวแบบธรรมดา เมื่อ R = N จะหมายถึงคิวเต็ม แต่คิวแบบนี้ เมื่อR = N จะปรับให้ R = 1
การดำเนินการกับคิววงกลม
การตรวจสอบคิวเต็มในคิววงกลม (Full)
การตรวจสอบคิวว่างในคิววงกลม (Empty)
การเพิ่มข้อมูลเข้าไปในคิววงกลม (Enqueue)
การดึงข้อมูลออกจากคิววงกลม (Dequeue)
⧪ การตรวจสอบคิวเต็มในคิววงกลม
(Full)
🔺การตรวจสอบว่าคิววงกลมมีข้อมูลเก็บอยู่จนเต็มหรือไม่นั้น
จะมีวิธีการทดสอบที่แตกต่างจากการตรวจสอบคิวปกติ
เนื่องจากคิววงกลมมีลักษณะวนเป็นวงกลม ดังนั้น
ตำแหน่งของข้อมูลมีโอกาสที่จะวนจากตำแหน่งสูงสุดกลับมายังตำแหน่งที่ 1 ได้เสมอ
🔺ลักษณะค่าของ Front และ
Rear เมื่อเกิดคิววงกลมเต็มมีอยู่ 2 แบบเมื่อ
Front อยู่ที่ 1 และ Rear อยู่ที่ตำแหน่งสูงสุดของคิว นั่นคือ อยู่ที่ค่า Max เมื่อ Front อยู่ที่ตำแหน่งใดๆ ภายในคิววงกลม
(ที่ไม่ใช่ตำแหน่งที่ 1) ค่าของ Rear ก็จะอยู่ตำแหน่งที่อยู่ด้านหน้าของ
Front ไปอีก 1 ค่า (Rear =
Front -1)
⧪ การเพิ่มข้อมูลเข้าไปในคิววงกลม
(Enqueue)
🔺ต่างไปจากการเพิ่มข้อมูลเข้าไปในคิวปกติ
ตรงที่เมื่อ Rear
มีค่าไปถึงค่าสูงสุดของอาร์เรย์แล้ว ถ้าจะต้องมีการขยับเพิ่มขึ้น
ค่า Rear ถัดไปก็คือ วนกลับมาที่ค่า 1 อีกครั้ง
🔺ขั้นตอนการเพิ่มข้อมูลเข้าไปในคิววงกลม
ตรวจสอบดูก่อนว่าคิววงกลมเต็มหรือไม่
ถ้าเต็มก็ให้แจ้งผลออกไป
เพิ่มค่าตำแหน่งของ Rear ให้ไปชี้
ณ ตำแหน่งถัดไป โดยถ้าเดิมตำแหน่งของ Rear คือตำแหน่งสูงสุดของคิวแล้ว
ตำแหน่งถัดไปของ Rear ก็คือ 1 ส่วนถ้ากรณีเดิมตำแหน่งของ
Rear อยู่ ณ ตำแหน่งใดๆ ก็ตาม ตำแหน่งถัดไปก็คือ
เพิ่มค่าขึ้นไปอีก 1
นำค่าที่ต้องการใส่ในคิวมาใส่ ณ ตำแหน่งใหม่ของ Rear
กรณีถ้าค่าที่เพิ่งใส่เข้าไปเป็นค่าแรกของคิววงกลม (Rear
= 1) ให้เลื่อน Front
มาชี้ที่ 1 ด้วย
⧪การดึงข้อมูลออกจากคิววงกลม (Dequeue)
ขั้นตอนการดึงข้อมูลออกจากคิววงกลม
🔼 ตรวจสอบคิววงกลมเป็นคิวว่างหรือไม่
ถ้าเป็นคิวว่างควรแจ้งออกมาว่าเป็นคิวว่าง
🔼 ตรวจสอบดูว่า
ข้อมูลตัวที่กำลังจะถูกดึงนี้ เป็นข้อมูลตัวสุดท้ายที่เหลืออยู่ในวงกลม 🔼ถ้าไม่ ถ้าใช่ให้ย้ายค่า Front และ
Rear กลับไปอยู่ ณ ตำแหน่งเริ่มต้น
🔼ถ้าไม่ใช่ข้อมูลตัวสุดท้ายที่เหลืออยู่
ให้ตรวจสอบอีกว่า ข้อมูลตัวนี้มีค่า Front อยู่ทตำแหน่งสูงสุดในอาร์เรย์หรือไม่
ถ้าใช่ให้ย้าย Front ลงมาที่ตำแหน่งค่า 1
🔼ถ้าไม่ใช่
ให้เพิ่มค่า Front
ขึ้นไปอีก 1 ค่า ย้ายไปชี้ที่ตัวถัดไป
ขอบคุณครับ
ตอบลบ