Queue [1] ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการสื่อสาร Website : ict.up.ac.th/yeunyong
หัวข้อวันนี้ ADT of Queue Value Definition Operation Definition Implementations of Queue (static memory allocation) Enqueue() , Dequeue() initQueue() , isEmpty() , isFull()
ลักษณะของคิวในชีวิตประจำวัน
ADT : Value Definition ข้อมูลที่จะเก็บในคิวจะมีชนิดเป็นอย่างไรก็ได้ ขึ้นอยู่กับว่าเราจะเก็บข้อมูลอะไร ข้อมูลที่ต้องการจัดเก็บไม่จำเป็นต้องเป็นข้อมูลเชิงเดี่ยว อาจเป็นข้อมูลเชิงโครงสร้างก็ได้ โครงสร้างมีความสัมพันธ์แบบเชิงเส้น ข้อมูลถูกเก็บเป็นแถวเรียงต่อกันไปในหน่วยความจำ มีลำดับของการใส่ข้อมูลและนำข้อมูลออก
ADT : Value Definition (cont’) ข้อมูลที่เข้าคิวทีหลังจะต่ออยู่ด้านท้ายแถว เรียกตำแหน่งนี้ว่า rear ข้อมูลที่จะนำออกจากคิวได้ต้องเป็นข้อมูลที่อยู่ตำแหน่งหัวแถวเท่านั้น เรียกตำแหน่งนี้ว่า front ข้อมูลที่นำเข้าไปในคิวก่อนจะถูกนำออกมาใช้งานก่อน เข้าก่อนออกก่อน (First In First Out : FIFO)
ADT : Operation definition การนำข้อมูลเข้า (enqueue) ใส่ข้อมูลด้านท้ายสุดของโครงสร้าง (rear) (ถ้าจะเข้าคิวต้องต่อท้ายแถว) การนำข้อมูลออก (dequeue) นำข้อมูลออกจากด้านหน้าของโครงสร้าง (front) (หัวแถวจะได้ออกจากคิวก่อน)
Implementation : Accessing Queue front empty A B C empty empty ข้อมูลออก ข้อมูลเข้า rear การเข้าถึงข้อมูลในโครงสร้างคิวต้องอาศัย index 2 ตัว คือ index ที่ชี้ไปยังข้อมูลตัวแรกของคิว (front) index ที่ชี้ไปยังข้อมูลตัวสุดท้ายของคิว (rear)
Implementation : enqueue , dequeue เพิ่มค่าของ rear ไปอีก 1 ช่อง (กำหนดตำแหน่งท้ายคิวที่จะนำข้อมูลมาต่อ) นำสมาชิกใหม่เข้ามาไว้ ณ ตำแหน่ง rear index dequeue นำข้อมูล ณ ตำแหน่ง front index ออกจากคิว เพิ่มค่าของ front ไปอีก 1 ช่อง (ไปชี้ที่ข้อมูลหัวคิวตำแหน่งถัดไป)
Example (implement with C) 1 2 3 Queue[4] A B C D init(Queue) enqueue(‘A’,Queue) enqueue(‘B’,Queue) X = dequeue(Queue) enqueue(‘C’,Queue) enqueue(‘D’,Queue) Y = dequeue(Queue) front = -1 1 2 3 rear = -1 1 2 3
Implementation of Queue (static memory allocation)
การสร้างคิว คล้ายกับสแตก ใช้อาร์เรย์ช่วยในการสร้างคิวได้ ในภาษาซี นิยมสร้างคิวโดยกำหนดเป็นตัวแปรแบบ structure ที่ประกอบไปด้วยเขตข้อมูล 3 เขต คือ อาร์เรย์ที่ใช้เก็บข้อมูลในคิว จำนวนเต็มที่ทำหน้าที่เป็น front index จำนวนเต็มที่ทำหน้าที่เป็น rear index ทุกครั้งที่มีการ enqueue, dequeue ทำผ่านฟังก์ชัน enqueue() , dequeue()
นอกจากนี้เราอาจต้องสร้างฟังก์ชันเพิ่มเติมเพื่อให้สามารถทำงานได้สมบูรณ์ เช่น initQueue() – กำหนดค่าเริ่มต้นให้กับคิว isEmpty() – ตรวจสอบว่าคิวว่างหรือไม่ isFull() – ตรวจสอบว่าคิวเต็มหรือไม่ enqueue() – นำข้อมูลใส่ลงคิว dequeue() – ดึงข้อมูลออกจากคิว
ต้องกำหนดค่าเริ่มต้นให้กับคิว #define MAXQUEUE 10 //กำหนดขนาดของคิว typedef struct { int data[MAXQUEUE]; // กำหนดเป็นคิวของ int โดยใช้ array int front; // กำหนด front index int rear; // กำหนด rear index } QUEUE; QUEUE Q; ต้องกำหนดค่าเริ่มต้นให้กับคิว
ฟังก์ชัน enqueue() parameter ข้อมูลที่จะใส่ลงคิว ชื่อของตัวแปรคิวที่จะใส่ข้อมูลลงไป return value ไม่มี body of function ตรวจสอบว่าคิวว่างหรือไม่ ถ้าใช่ -> กำหนดให้ front , rear ชี้ที่ array ช่องแรก ถ้าไม่ใช่ -> เลื่อน rear ไป 1 ตำแหน่ง นำข้อมูลใส่อาร์เรย์ ณ ตำแหน่ง rear
ฟังก์ชัน dequeue() parameter ชื่อของตัวแปรคิวที่จะดึงข้อมูลออกมา return value ผลลัพธ์ของการดึงข้อมูล (ชนิดตามชนิดของข้อมูลใน queue) body of function return ข้อมูลจากอาร์เรย์ ณ ตำแหน่ง front ตรวจสอบว่าคิวมีข้อมูลอยู่ตัวเดียวหรือไม่ ถ้าใช่ -> กำหนดให้ front , rear มีสถานะเป็นคิวว่าง ถ้าไม่ใช่ -> เลื่อน front ไป 1 ตำแหน่ง
ฟังก์ชัน initQueue() parameter ชื่อของตัวแปรคิวที่จะกำหนดค่าเริ่มต้น return value ไม่มี body of function กำหนดค่า front และ rear เป็นสถานะคิวว่าง front = rear = -1
ฟังก์ชัน isEmpty() parameter ชื่อของตัวแปรคิวที่จะตรวจสอบว่าว่างหรือไม่ return value มีได้ 2 สถานะ คือ ว่าง (1) หรือ ไม่ว่าง (0) body of function ตรวจสอบว่าคิวว่างหรือไม่ (front==-1), (rear==-1), ((front==-1)&&(rear==-1)) ถ้าใช่ return 1 , ถ้าไม่ใช่ return 0
ฟังก์ชัน isFull() parameter ชื่อของตัวแปรคิวที่จะตรวจสอบว่าเต็มหรือไม่ return value มีได้ 2 สถานะ คือ เต็ม (1) หรือ ไม่เต็ม (0) body of function ตรวจสอบว่าคิวเต็มหรือไม่ ( rear == (MAXQUEUE - 1) ) ถ้าใช่ return 1 , ถ้าไม่ใช่ return 0