Queue แบบ Deep-Dive: จาก FIFO สู่ระบบคิวจริง
บทนี้พาเรียน Queue ครบตั้งแต่พื้นฐานโครงสร้าง การออกแบบ implementation ที่ดี ไปจนถึงการใช้ใน BFS และงานระบบจริง พร้อมต่อยอดด้วย Queue Lab
1) Queue คืออะไร
Queue คือโครงสร้างข้อมูลที่รับสมาชิกเข้าท้ายและนำสมาชิกออกที่หัวตามลำดับเวลาเข้า
Mental model: เหมือนคิวซื้อของ คนมาก่อนจะถูกบริการก่อน
Recap: Queue เน้นความยุติธรรมตามลำดับเข้าใช้งาน
2) แนวคิด FIFO คืออะไร
FIFO คือ First In, First Out เข้าเป็นคนแรกต้องออกก่อน
Mental model: คิวรถที่ด่านเก็บเงินทางด่วน
Recap: FIFO เป็นกฎหลักของ Queue
3) โครงสร้างพื้นฐานของ Queue
Queue พื้นฐานมีพื้นที่เก็บข้อมูลและ operation สำคัญคือ enqueue, dequeue, peek, isEmpty, size
Mental model: มี 2 ปลายหลัก: front สำหรับออก และ rear สำหรับเข้า
Recap: API ของ Queue ชัดและเหมาะกับงานคิว
4) Front และ Rear คืออะไร
Front ชี้ข้อมูลตัวหน้าสุด ส่วน Rear ชี้ตำแหน่งท้ายสุดของคิว
Mental model: front = หัวคิว, rear = ท้ายคิว
Recap: enqueue ทำงานฝั่ง rear, dequeue ทำงานฝั่ง front
5) การทำงานของ enqueue
enqueue คือการเพิ่มสมาชิกใหม่เข้าไปด้านท้ายของ queue
Mental model: คนใหม่เข้าต่อท้ายคิว
เพิ่มสมาชิกที่ rear
Recap: enqueue เพิ่มลำดับงานโดยไม่กระทบหัวคิว
6) การทำงานของ dequeue
dequeue คือการนำสมาชิกหน้าสุดออกจากคิว
Mental model: บริการคนที่อยู่หัวคิวก่อน
นำสมาชิก front ออก
Recap: dequeue ลดขนาด queue และขยับหัวคิว
7) การดูข้อมูลตัวหน้าสุดของ queue (peek / front)
peek อ่านสมาชิก front โดยไม่ลบ
Mental model: ดูว่าใครอยู่หัวคิวตอนนี้
อ่านค่าหน้าสุดโดยไม่เปลี่ยนคิว
Recap: ใช้ peek เพื่อตัดสินใจก่อน dequeue
8) การตรวจว่า queue ว่างหรือไม่
ตรวจจากขนาดว่าเท่ากับ 0 หรือไม่
Mental model: ไม่มีสมาชิกแปลว่าไม่มีงานรอคิว
คืน true เมื่อคิวว่าง
Recap: เช็กคิวว่างก่อน dequeue ทุกครั้ง
9) การหาขนาดของ queue
อ่านจำนวนสมาชิกทั้งหมดในคิวปัจจุบัน
Mental model: นับจำนวนงานที่รออยู่
คืนจำนวนสมาชิก
Recap: size ใช้ควบคุม loop และ monitor load ได้ดี
10) Queue ต่างจาก Array ยังไง
Array เข้าถึง index ได้อิสระ ส่วน Queue จำกัดรูปแบบใช้งานตาม FIFO เพื่อรักษาลำดับคิว
Mental model: Queue คือ policy บน container ไม่ใช่แค่โครงสร้างเก็บข้อมูล
Recap: Queue คุมวินัยการเข้าออกของข้อมูล
11) Queue สร้างจาก Array ได้ยังไง
ใช้ array เป็น storage และเปิด API เฉพาะ enqueue/dequeue/peek เพื่อคุม behavior
Mental model: ซ่อน method ที่ทำลายกติกา FIFO
Recap: array-based queue ทำง่าย แต่อาจมีค่าใช้จ่าย shift
12) Queue สร้างจาก Linked List ได้ยังไง
เก็บทั้ง head และ tail ของ linked list แล้วทำ enqueue ที่ tail, dequeue ที่ head
Mental model: front=head และ rear=tail
ใช้ head/tail ลดต้นทุน operation หลัก
Recap: linked-list queue ให้ enqueue/dequeue เป็น O(1) ได้ง่าย
13) Time Complexity ของ enqueue / dequeue / peek
ถ้าออกแบบถูก (linked list หรือ circular buffer) enqueue/dequeue/peek ทำได้ O(1)
Mental model: แตะเฉพาะ front/rear ไม่ต้องเดินทั้งคิว
Recap: ประสิทธิภาพขึ้นกับ implementation ไม่ใช่ชื่อโครงสร้างอย่างเดียว
14) ปัญหาของ queue แบบ array ธรรมดา
การใช้ `shift()` บน array อาจมีต้นทุน O(n) เพราะต้องเลื่อนสมาชิกทั้งหมด
Mental model: ดึงหัวคิวแล้วข้อมูลที่เหลือขยับทั้งแถว
Recap: คิวงานเยอะควรหลีกเลี่ยง shift ซ้ำๆ
15) Circular Queue คืออะไร
Circular queue ใช้อาร์เรย์แบบวนรอบ โดย front/rear ขยับแบบ modulo ตามความจุ
Mental model: ปลายอาร์เรย์ต่อกับต้นอาร์เรย์เป็นวงแหวน
Recap: circular queue ลดปัญหาช่องว่างทิ้งท้าย
16) การทำงานของ Circular Queue
enqueue/dequeue ขยับ pointer และวนกลับ 0 เมื่อถึงท้าย buffer
Mental model: เดิน pointer บนวงกลม ไม่ใช่เส้นตรง
หลักการขยับ index ใน circular queue
Recap: คุมเงื่อนไขเต็ม/ว่างให้ดีคือหัวใจ
17) Deque คืออะไร
Deque คือคิวที่เพิ่ม/ลบได้ทั้งหัวและท้าย (double-ended queue)
Mental model: คิวที่ยืดหยุ่นขึ้นสองทิศทาง
Recap: deque เหมาะกับ sliding window และ monotonic queue
18) Priority Queue คืออะไร
Priority queue ดึงข้อมูลตามลำดับความสำคัญ ไม่ได้ดึงตามเวลาเข้าเสมอ
Mental model: คิวฉุกเฉินของโรงพยาบาลที่ priority มาก่อน
Recap: priority queue มักใช้ heap เป็น implementation หลัก
19) Queue vs Stack ต่างกันยังไง
Queue เป็น FIFO ส่วน Stack เป็น LIFO จึงให้พฤติกรรมและ use case ต่างกัน
Mental model: Queue = ลำดับเวลา, Stack = ย้อนล่าสุด
Recap: ระบุรูปแบบเข้าออกของข้อมูลก่อนเลือกโครงสร้าง
20) Use case ของ Queue
เช่น task scheduling, event processing, message queue, network packet buffering
Mental model: งานที่ต้องรับ-รอ-ประมวลผลตามลำดับเวลา
Recap: Queue เด่นในระบบ asynchronous และ producer-consumer
21) Queue กับ BFS เกี่ยวกันยังไง
BFS ใช้ queue เพื่อเก็บโหนดที่ค้นพบแล้วรอสำรวจถัดไปตามลำดับชั้น
Mental model: สำรวจกราฟแบบเป็นชั้นจากต้นทางออกไป
คิวควบคุมลำดับการสำรวจโหนด
Recap: ไม่มี queue ก็ไม่ใช่ BFS แบบคลาสสิก
22) Queue กับระบบงานคิวในโลกจริง
ระบบจริงใช้คิวในงาน call center, printer spool, API rate limiting, background jobs
Mental model: รับงานก่อนแล้วทยอยประมวลผลตามลำดับหรือ policy ที่กำหนด
Recap: Queue ทำให้ระบบรับโหลดได้เสถียรขึ้น
23) ข้อดีของ Queue
รักษาลำดับยุติธรรม, operation หลักเร็วเมื่อออกแบบถูก, เหมาะกับงาน async และ buffering
Mental model: โครงสร้างเรียบง่ายแต่รองรับระบบจริงได้ดี
Recap: Queue ช่วย decouple producer และ consumer ได้ดี
24) ข้อจำกัดของ Queue
ไม่เหมาะกับ random access และถ้า implementation ไม่ดีอาจมี bottleneck เรื่องประสิทธิภาพ
Mental model: Queue ตั้งใจจำกัดการเข้าถึงเพื่อคุมลำดับ
Recap: ถ้าโจทย์ต้องเข้าถึงข้อมูลกลางคิวบ่อย ควรใช้โครงสร้างอื่น
25) โจทย์ฝึก Queue ระดับเริ่มต้น
Exercise 1: เขียน Queue class ด้วย array
โจทย์: ทำ `enqueue`, `dequeue`, `peek`, `isEmpty`, `size` ให้ครบ
Hint: เริ่มจากเวอร์ชันง่ายก่อน แล้วค่อยคิด optimization เรื่อง shift
Exercise 2: ออกแบบ Circular Queue
โจทย์: รองรับขนาดคงที่และวน pointer ด้วย modulo
Hint: กำหนดกติกา full/empty ให้ชัดก่อนเขียน method
Exercise 3: BFS บนกราฟเล็ก
โจทย์: คืนลำดับการเยี่ยมโหนดแบบ breadth-first
Hint: ใช้ queue เก็บ frontier ของโหนดที่รอสำรวจ
Exercise 4: จำลองคิวงาน round-robin
โจทย์: รับงานหลายชิ้นแล้วประมวลผลทีละ quantum
Hint: งานยังไม่เสร็จต้องวนกลับไปท้ายคิว
ถ้าต้องการฝึกแบบมี runtime checks ให้ไป Queue Lab ซึ่งมี 4 โจทย์เรียงระดับจาก operation พื้นฐานไปถึงการจำลองคิวงาน
ไปหน้า Queue Lab26) ข้อผิดพลาดที่พบบ่อยในการใช้ Queue
เช่น dequeue จากคิวว่าง, สับสน front/rear, ใช้ shift ซ้ำในงานใหญ่, และไม่จัดการ overflow/underflow
Mental model: เขียน guard สำหรับ empty/full เสมอในโค้ด production
Recap: edge case รอบ front/rear คือจุดพลาดยอดนิยม