โครงสร้างข้อมูลแบบคิว QUEUE
เนื้อหา คิว โอเปอร์เรชั่นของคิว คิวแบบวงกลม การประยุกต์ใช้งานคิว การเพิ่มข้อมูลเข้าไปในคิว (En Queue) การลบข้อมูลออกจากคิว (De Queue) คิวแบบวงกลม การประยุกต์ใช้งานคิว Queue Slide# 2
คิว : Queue คิวเป็นลิสต์แบบเชิงเส้นเช่นเดียวกับสแตค แต่มีความแตกต่างกันตรงที่คิวมีตัวชี้ 2 ตัว คือ front และ rear สำหรับการใส่ข้อมูลเข้าและนำข้อมูลออก คิวมีกระบวนการทำงานแบบ First In First Out : FIFO Queue Slide# 3
ตัวอย่างของคิว front rear front +1 rear A B C … n ลบข้อมูล A B C … n Queue Slide# 4
Chapter 4 Stack and Queue โครงสร้างข้อมูลแบบเชิงเส้นเช่นเดียวกับสแตก และคิว มีตัวชี้ 2 ตัว - หัว (Head) - หาง (Tail) ข้อมูลจะเข้าทางหางและออกทางหัวที่เรียกว่า FIFO ก ข ค H T
Chapter 4 Stack and Queue ข ค H+1 T ข ค ง H+1 T+1 A H T H and T = NULL
Chapter 4 Stack and Queue Queue ( circular queue) H=1 H=2 H=3 ก ข ข ค ง ค ง T=2 T=4 T=4 1 2 3 4 1 2 3 4 1 2 3 4 H=3 H=4 H=1 จ ค ง จ ง จ ฉ T=1 T=1 T=2 1 2 3 4 1 2 3 4 1 2 3 4 Circular queue มีหลักอยู่ว่าต้องทราบจำนวนสูงสุดของ หน่วยความจำที่ใช้เก็บข้อมูล
สถานะของคิว A a) empty queue b) enqueue A A B B c) enqueue B 0 1 2 0 1 2 front = 0 rear = 0 front = -1 rear = -1 A a) empty queue b) enqueue A 0 1 2 0 1 2 front = 0 rear = 1 front = 1 rear = 1 A B B c) enqueue B d) dequeue A 0 1 2 0 1 2 front = 1 rear = 2 B C front = 2 rear = 2 C e) enqueue C full queue f) dequeue B Queue Slide# 8
Chapter 4 Stack and Queue อัลกอริธึม INSQ (Q,N,H,T,DATA) : Q = คิวของข้อมูล ถ้า H = 1 และ T = N หรือถ้า H = T+1 แสดงว่าคิวเต็มและจบการทำงาน 1.1 ถ้า H = NULL ดังนั้นให้ H = 1 and T = 1 1.2 ถ้า T = N ให้ T = 1 และ 1.3 ถ้า T = ตำแหน่งใดๆให้ T = T+1 2. ให้ Q [T] = DATA จบการดำเนินการ
Chapter 4 Stack and Queue อัลกอริธึม DELQ (Q,N,H,T,DATA) ถ้า H = NULL ดังนั้นคิว Underflow และจบการทำงาน ให้ DATA = Q [H] 2.1 ถ้า H = T ให้ H = T= NULL 2.2 ถ้า H = N ให้ H = 1 2.3 ถ้า H = ตำแหน่งใดๆในคิว ให้ H = H+1 จบการดำเนินการ
การเพิ่มข้อมูลเข้าไปในคิว : En Queue การนำข้อมูลเข้าที่ rear ซึ่งจะชี้สมาชิกตัวสุดท้าย และต้องเพิ่มค่า rear ทีละ 1 ก่อนจะนำสมาชิกใหม่เข้ามา และทำลักษณะเช่นนี้จนกว่าคิวจะเต็ม ที่ rear=n-1 เป็นค่าสูงสุด Queue Slide# 11
De Queue ในการจัดรูปแบบของคิวอีกรูปแบบเรียกว่า ดีคิว หรือ เดค ซึ่งแบ่งออกเป็น 2 ชนิด ดีคิวที่จำกัดการนำเข้าของข้อมูล(In-put restricted de queue) ดีคิวที่ใส่ข้อมูลได้เพียงด้านเดียว แต่ลบข้อมูลออกได้ทั้ง สองด้าน ดีคิวที่จำกัดการส่งออกของข้อมูล(Out-put restricted de queue) ดีคิวที่ใส่ข้อมูลได้ทั้งสองด้าน แต่ลบข้อมูลออกได้เพียง ด้านเดียว
En Queue ในการจัดลำดับและการลบออกของคิวที่มีขบวนการดัง ต่อไปนี้ ข้อมูลที่มีลำดับความสำคัญสูงสุดจะถูกเรียกทำงานก่อน ในกรณีที่มีลำดับความสำคัญเท่ากันเลือกอันที่มาก่อน ในการสร้างคิวแบ่งได้เป็น 2 ลักษณะ คิวแบบแถวเดียว (One Way List) ประกอบด้วย 3 ส่วน (ข้อมูล, ลำดับความสำคัญ และตัวชี้ถัดไป) H T 1 ก 1 ก 1 ก 1 ก
Chapter 4 Stack and Queue ในการสร้างคิวแบ่งได้เป็น 2 ลักษณะ คิวแบบหลายคิวตามจำนวนลำดับความสำคัญและกำหนด เป็นลักษณะหลายแถวเรียกว่า circular Queue มีลักษณะ 2 มิติ ไม่เป็นข้อมูลแบบเชิงเส้น ตำแหน่ง 1 2 3 4 1 ก 2 ข ค ง 3 จ 4 ฉ ลำดับความสำคัญ
Enqueue addq ( int item ) { if ( rear == MAX - 1 ) { printf ( "\nQueue is full" ) ; return ; } rear++ ; arr[rear] = item ; if ( front == -1 ) front = 0 ; } กรณี e) และ f) คิวเต็ม Queue Slide# 15
การลบข้อมูลจากคิว : De Queue การนำข้อมูลออกจากคิว จะออกที่ front ซึ่งจะชี้ที่สมาชิกตัวแรกเสมอ ค่า front จะเพิ่มขึ้นทีละ 1 ทุกครั้งหลังจากนำ ข้อมูลออกจากคิวแล้ว ทำจนกระทั่ง front = rear โดยกำหนดให้ค่าของ front=-1 และ rear=-1 ซึ่งแสดงว่าคิวว่าง Queue Slide# 16
กรณีลบคิวที่เหลือเพียงตัวเดียว Dequeue delq( ) { int data ; if ( front == -1 ) { printf ( "\nQueue is Empty" ) ; return NULL ; } data = arr[front] ; if ( front == rear ) front = rear = -1 ; else front++ ; return data ; } กรณีลบคิวที่เหลือเพียงตัวเดียว Queue Slide# 17
คิววงกลม : Circular Queue คือคิวที่เปรียบเสมือนกับ ลิเนียร์อาเรย์ทั่ว ๆ ไป แตกต่างเพียงแต่ว่า คิววงกลมสามารถกลับไปใช้คิวหน้าได้ในกรณีที่หมดคิวปกติแล้ว Queue Slide# 18
คิวแบบวงกลม C f) full queue D C g) enqueue D 0 1 2 front = 2 rear = 2 C f) full queue 0 1 2 front = 1 rear = 0 D C กรณีคิวเต็ม กำหนดให้ rear ไปชี้ที่จุดเริ่มต้นใหม่ (0) เพื่อสามารถเพิ่ม D เข้าไปได้ g) enqueue D Queue Slide# 19
Enqueue of Circular Queue addq ( int item ) { if ( ( rear == MAX - 1 && front == 0 ) || ( rear + 1 == front ) ) { printf ( "\nQueue is full" ) ; return ; } if ( rear == MAX - 1 ) rear = 0 ; else rear++ ; arr[rear] = item ; if ( front == -1 ) front = 0 ; แสดงข้อความว่า “คิวเต็ม” เช่น กรณี h) กรณี g) คิวเต็ม เมื่อต้องการเพิ่มข้อมูลเข้าไปอีก ให้กำหนด rear ไปชี้ที่จุดเริ่มต้นใหม่ Queue Slide# 20
เพิ่มข้อมูลในคิวแบบวงกลม 0 1 2 0 1 2 front = 1 rear = 0 front = 2 rear = 1 D C D E C g) enqueue D h) enqueue E Queue Slide# 21
Dequeue of Circular Queue delq( ) { int data ; if ( front == -1 ) { printf ( "\nQueue is Empty" ) ; return NULL ; } else { data = arr[front] ; if ( front == rear ) front = rear = -1 ; { if ( front == MAX - 1 ) front = 0 ; front++ ; return data ; } กรณี k) ลบคิวที่เหลือเพียงตัวเดียว กรณี i) ลบคิวที่ช่องความจำสุดท้าย กำหนดให้ front วนไปชี้ที่จุดเริ่มต้นใหม่ Queue Slide# 22
ลบข้อมูลในคิวแบบวงกลม 0 1 2 0 1 2 front = 2 rear = 1 front = 0 rear = 1 D E C D E h) enqueue E i) dequeue C 0 1 2 0 1 2 front = 1 rear = 1 front = -1 rear = -1 E j) dequeue D k) dequeue E Queue Slide# 23
Chapter 4 Stack and Queue สรุป ในบทแสดงโครงสร้างข้อมูล 2 ชนิด สแตก และ คิว ความแตกต่างของโครงสร้างใน การจัดเก็บ และขบวนการลบ การแทรกข้อมูล การประยุกต์ใช้ในเรื่องการจัดลำดับการทำงานสมการ ทางคณิตศาสตร์ ในเรื่องการแก้สมการ อินฟิก ด้วย พรีฟิก และโพสฟิก
Home work 1. จงอธิบายถึงสิ่งที่เหมือนกันและสิ่งที่แตกต่างกันระหว่างสแตกกับคิว 2. “ท็อปของสแตก” คืออะไร จงอธิบาย 3. จงอธิบายถึงสิ่งที่เหมือนกันและสิ่งที่แตกต่างกันระหว่างคิวเส้นตรงกับคิววงกลม 4. จงเปรียบเทียบข้อดี ข้อเสียของโครงสร้างข้อมูลสแตก คิววงกลม และคิวเส้นตรง 5. คิวขนาด 7 ค่า มีรายการต่อไปนี้ Front = 2, Rear = 6, Queue [ ] = {null, null, “ขนุน”, “ส้มโอ”, “แตงโม”, “ฝรั่ง”, null } จงอธิบายผลของคิวแบบวงกลม โดยมีค่าเริ่มต้นตำแหน่งที่ 0 รวมทั้ง Front และ Rear เมื่อมีการกระทำต่อไปนี้
Home work ก. เพิ่มมะม่วง ข. ลบ 2 รายการออกจากคิว ก. เพิ่มมะม่วง ข. ลบ 2 รายการออกจากคิว ค. เพิ่ม “ทุเรียน” ลงในคิว ง. เพิ่ม “องุ่น” ลงในคิว จ. ลบ 2 รายการออกจากคิว ฉ. เพิ่ม “ละมุด” ลงในคิว
Home work 6. จงเขียนแผนภาพและค่าของตัวแปรของคิวที่มีสมาชิกเป็นเลขจำนวนเต็มและสร้างด้วยลิงค์ลิสต์ เมื่อมีการดำเนินการดังนี้ ก. สร้างคิวว่าง ข. เพิ่ม 5 และ 8 ลงในคิว ค. นำข้อมูลออกจากคิว 1 ค่า ง. เพิ่มข้อมูลในคิวอีก 5 ค่า จ. นับจำนวนสมาชิกในคิว