วันศุกร์ที่ 12 ธันวาคม พ.ศ. 2557

โครงสร้างข้อมูลแบบคิว (Queue)


  • มีลักษณะคล้ายกับสแตก  คือ ข้อมูลในคิวจัดเรียงกันอย่างมีลำดับเช่นเดียวกับสแตก แต่ต่างกันตรงที่คิวแยกทางเข้าและออกของข้อมูลไว้คนละส่วนกัน
  • ข้อมูลที่นำเข้าไปเก็บก่อนจะถูกนำออกมาทำงานก่อน ส่วนข้อมูลที่เข้าไปเก็บทีหลังก็จะถูกนำออกมาใช้งานทีหลัง 
  • มีคุณสมบัติที่เรียกว่า  FIFO (First-In-First-Out)
  • มีขั้นตอนที่ซับซ้อนกว่าสแตก  เนื่องจากต้องจัดการกับตัวชี้ front และ rear ให้ถูกต้อง
  • ตัวชี้ Front ชี้ไปที่สมาชิกตัวแรก และตัวชี้ Rear ชี้ไปที่สมาชิกตัวสุดท้ายของคิว โดยที่เวลาข้อมูลจะเข้าสู่คิวจะเข้าทาง R ส่วนเวลาที่ข้อมูลจะออกจากคิวจะออกทาง F 


การเพิ่มข้อมูลในคิว (Enqueue)
           การเพิ่มข้อมูลในคิว ข้อมูลจะถูกเพิ่มเข้ามาทางด้าน Rear ของคิว
ขั้นตอนการเพิ่มข้อมูลลงในคิว

  1. ตรวจสอบว่าคิวเต็มหรือไม่ กรณีเกิดคิวเต็มค่าของ Rear จะเท่ากับขนาดสูงสุดของตัวแปรอาร์เรย์ ถ้าคิวเต็มควรแจ้งด้วยว่า คิวเต็ม ไม่สามารถเพิ่มข้อมูลได้
  2. การนำข้อมูลเข้าสู่คิว  จะไม่สามารถนำเข้าในขณะที่คิวเต็มหรือไม่มีที่ว่าง ถ้าพยายามจะทำจะเกิด error ที่เรียกว่า  overflow
  3. ถ้าคิวยังว่างอยู่ ให้ขยับ Rear ไปที่ตำแหน่งถัดไป 1 ตำแหน่ง
  4. นำข้อมูลที่ต้องการเพิ่มมาเก็บไว้ ณ ตำแหน่งใหม่ของ Rear
  5. ถ้าข้อมูลที่เพิ่มเข้าไปเป็นค่าเดียวในคิว ให้ขยับ 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
ขั้นตอนการดึงข้อมูลจากคิว
  1. ตรวจสอบดูก่อนว่า คิวว่างหรือไม่ ถ้าคิวว่างให้แจ้งออกมาว่า คิวว่าง ดึงข้อมูลไม่ได้
  2. การนำข้อมูลออกจากคิว  จะไม่สามารถนำอะไรออกจากคิวที่ว่างเปล่า  ถ้าพยายามจะทำจะเกิด error ที่เรียกว่า underflow
  3. ถ้าคิวไม่ว่าง ให้ดึงข้อมูลที่ Front ออกมาเก็บไว้ในตัวแปร (ก็คือ ตัวข้อมูลที่ดึงออกมาได้)
  4. ตรวจสอบดูว่า ข้อมูลที่ถูกดึงออกมาเป็นข้อมูลตัวสุดท้ายในคิวหรือไม่ นั่นคือ ดูว่า Front = Rear หรือไม่
  5. ถ้า Front = Rear นั่นคือ ข้อมูลที่ดึงออกมาเป็นข้อมูลตัวสุดท้าย ฉะนั้นตอนนี้คิวว่างแล้ว วิธีการบอกว่าคิวว่างก็คือ Front = Rear = 0
  6. ถ้า 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


ไม่มีความคิดเห็น:

แสดงความคิดเห็น