คิว (Queue) Queue ADT Queue เป็น List ชนิดหนึ่ง แต่สำหรับ queue การแทรกข้อมูลลงบน queue (Insertion) จะทำที่ปลายใดปลายหนึ่งของ Queue ในขณะที่การลบข้อมูลออกจากคิว (Deletion) จะกระทำที่อีกปลายหนึ่งของ List 25 June 2006 12.00 AM Week 08 - Queue
คิว (Queue) การดำเนินการ (Operation) พื้นฐานบนคิว Enqueue คือการ Insert สมาชิกลงไปที่ด้านปลายของ List ซึ่งเรียกว่าตำแหน่ง Rear Dequeue คือการ Delete และ Return ค่าสมาชิกที่ด้านหัว List ซึ่งเรียกว่าตำแหน่ง Front 25 June 2006 12.00 AM Week 08 - Queue
ลักษณะของ Queue (Abstract Model of a Queue) การดำเนินการทุกอย่างบน Queue ไม่ว่าจะเกิดจากการสร้างโดยใช้ Array หรือการสร้างโดยใช้ List ก็ตาม ล้วนมี running time เป็น O(1) ซึ่งน้อยมากๆ 25 June 2006 12.00 AM Week 08 - Queue
การสร้าง Queue โดยใช้ Array (Array Implementation of Queue) สำหรับโครงสร้างข้อมูลแบบ Queue แต่ละตัวเราต้องเก็บค่าต่างๆของ Queue ดังนี้ queue[ ] อาร์เรย์เก็บค่าสมาชิกแต่ละตัวในคิว front ตำแหน่งปลายด้านหัวของคิว rear ตำแหน่งปลายด้านท้ายของคิว size จำนวนสมาชิกที่มีอยู่ในคิวทั้งหมด 25 June 2006 12.00 AM Week 08 - Queue
การสร้าง Queue โดยใช้ Array (Array Implementation of Queue) 56 85 12 8 X rear rear front Enqueue enqueue ข้อมูล element X ลงไปในคิว 1. เพิ่มค่า size และเพิ่มค่า rear 2. set ค่า queue[rear] = X 25 June 2006 12.00 AM Week 08 - Queue
การสร้าง Queue โดยใช้ Array (Array Implementation of Queue) 56 85 12 8 front front rear Dequeue ในการ dequeue ข้อมูล element หนึ่งๆออกไป 1. return ค่า queue[front] 2. ลดค่า size และเพิ่มค่า front ขึ้นหนึ่งค่า 25 June 2006 12.00 AM Week 08 - Queue
Circular Array Implementation เมื่อไรก็ตามที่ค่า Front และ Rear ขึ้นลงไปถึงสุดขอบเขตของอาร์เรย์ ให้รวบกลับขึ้นมาเป็นส่วนเริ่มต้นของอาร์เรย์ เรียกว่าเป็นการสร้างโดยใช้ Circular Array ถ้าไม่ว่าการเพิ่มค่า Front หรือค่า Rear ทำให้เกินขอบเขตของอาร์เรย์ ค่าตำแหน่งจะถูก reset กลับไปเป็นตำแหน่งแรกของอาร์เรย์ 25 June 2006 12.00 AM Week 08 - Queue
ข้อที่ควรระวังในการใช้ Circular Array เราต้องตรวจสอบว่า Queue ดังกล่าวเป็นคิวเปล่า (Empty Queue) หรือไม่ เนื่องจากการ Dequeue ในขณะที่คิวว่างจะเป็นการ return ค่าที่ไม่ได้รับการกำหนดค่าเป็นขยะออกมา ซึ่งเราอาจไม่ได้สังเกตข้อผิดพลาดนี้ ขนาดของ Queue ในขณะที่คิวว่าง (Empty Queue) จะได้ rear = front -1 เมื่อไม่ใช้ Circular Array ขนาดของอาร์เรย์เป็น Asize คิวจะเต็มเมื่อมีสมาชิกทั้งหมด Asize ตัว 25 June 2006 12.00 AM Week 08 - Queue
ตัวอย่างการดำเนินการบน Queue สถานะเริ่มต้น (Initial State) หลังจาก Enqueue(1) 25 June 2006 12.00 AM Week 08 - Queue
หลังจาก Dequeue ซึ่งเป็นการ Return ค่า 2 ออกมา Enqueue(3) หลังจาก Dequeue ซึ่งเป็นการ Return ค่า 2 ออกมา 25 June 2006 12.00 AM Week 08 - Queue
หลังจากการ Dequeue ซึ่งเป็นการ Return ค่า 4 ออกมา 25 June 2006 12.00 AM Week 08 - Queue
หลังจากการ Dequeue ซึ่งเป็นการ Return ค่า 3 ออกมา และทำให้คิวว่าง (Make Empty Queue) สังเกตว่า Rear = Front - 1 25 June 2006 12.00 AM Week 08 - Queue
การประกาศ Queue ADTs /*Declare Function Prototype*/ PtrToQRecord createQueue(int); void makeEmpty(PtrToQRecord); Boolean isEmpty(PtrToQRecord); Boolean isFull(PtrToQRecord); void front(PtrToQRecord); void enqueue(TypeOfElement, PtrToQRecord); void dequeue(PtrToQRecord); void deleteQueue(PtrToQRecord); const CAPACITY; Struct QueueRecord { int front; int rear; int size; TypeOfElement queuearray[CAPACITY]; }; 25 June 2006 12.00 AM Week 08 - Queue
โครงสร้างของ Structure สำหรับ Queue QueueRecord Struct QueueRecord { int front; int rear; int size; int queueArray[CAPACITY]; } int front int rear int size int queueArray 25 June 2006 12.00 AM Week 08 - Queue
การตรวจสอบว่าอาร์เรย์ของ Queue เป็นอาร์เรย์เปล่าหรือไม่ IsEmpty การตรวจสอบว่าอาร์เรย์ของ Queue เป็นอาร์เรย์เปล่าหรือไม่ Algorithm Boolean isEmpty(pointerToQRecord) pointerToQRecord – pointer to queue record Output True – if the queue is empty False – if the queue is not empty Begin (return size of pointerToQRecord is 0) End 25 June 2006 12.00 AM Week 08 - Queue
MakeEmpty การทำให้คิวเป็นคิวว่าง Algorithm makeEmpty(pointerToQRecord) pointerToQRecord – pointer to queue record Begin (Set size of pointerToQRecord to 0) (Set front of pointerToQRecord to 1) (Set rear of pointerToQRecord to 0) End 25 June 2006 12.00 AM Week 08 - Queue
Enqueue การ Enqueue ใส่ข้อมูลลงในคิว Algorithm enqueue(newElement, pointerToQRecord) newElement – new element to be entered into the queue pointerToQRecord – pointer to queue record Begin If (isFull(pointerToQRecord) is True) (Show Error Full Queue) Else { (Increase size of pointerToQRecord by 1) If ((rear of pointerToQRecord + 1) = CAPACITY) (Set rear of pointerToQRecord to 0) (Increase rear of pointerToQRecord by 1) (Set queueArray of pointerToQRecord [rear of pointerToQRecord] to newElement) } End 25 June 2006 12.00 AM Week 08 - Queue