ภาพรวม Queue Variants
Queue แบบปกติเป็น FIFO (First In First Out) แต่มี 2 แบบเวเรียนที่สำคัญ:
- Deque (Double-Ended Queue) - เพิ่ม/ลดได้ทั้ง 2 ข้าง
- Priority Queue - จัดเรียงตาม Priority (ไม่ใช่ลำดับเข้ามา)
Part 1: Deque (Double-Ended Queue)
#include <deque>
คุณสมบัติ
- Random Access:
operator[],at()- O(1) - Insert/Delete ทั้ง Front และ Back - O(1) Amortized
- ไม่มีการจัดเรียงอัตโนมัติ (เก็บลำดับการ Insert)
- Iterator เป็น Random Access Iterator
ฟังก์ชันหลัก
| Function | คำอธิบาย | ||
|---|---|---|---|
push_front(val) | เพิ่มหน้า | ||
push_back(val) | เพิ่มท้าย | ||
pop_front() | ลบหน้า | ||
pop_back() | ลบท้าย | ||
front() | เข้าถึงหน้า | ||
back() | เข้าถึงท้าย | ||
at(index) | เข้าถึงแบบ Random Access (Bounds Checked) |
| Feature | Queue | Deque | Priority Queue |
|---|---|---|---|
| Access Pattern | FIFO | Both Ends | Priority-based |
| Push Front | No | O(1) | No |
| Push Back | O(1) | O(1) | O(log n) |
| Pop Front | O(1) | O(1) | N/A |
| Pop Back | No | O(1) | N/A |
| Top/Max Access | Front Only | Front/Back | O(1) Top |
| Random Access | No | Yes O(1) | No |
| Search | O(n) | O(n) | O(n) |
| Underlying | deque/list | Block Array | Heap (vector) |
การใช้งานร่วมกัน: Deque เป็น Container ของ Priority Queue
Priority Queue ใน STL ใช้ Container ภายใน (Default: vector) แต่สามารถระบุเป็น deque ได้:
// ใช้ deque เป็น underlying container priority_queue> pq1; // Max heap with deque priority_queue , greater > pq2; // Min heap with deque
ประยุกต์ใช้ Deque
- Sliding Window Maximum/Minimum
- Palindrome Checking
- Browser History (Back/Forward)
- Undo/Redo System
- BFS 0-1 Shortest Path (Deque as Queue)
ประยุกต์ใช้ Priority Queue
- Dijkstra / A* Pathfinding
- Huffman Coding
- Task Scheduling (OS)
- K-th Largest Element
- Event Simulation
Best Practices
- ใช้
dequeเมื่อต้องการ Insert/Delete ทั้ง 2 ข้าง + Random Access - ใช้
priority_queueเมื่อต้องการเข้าถึง Max/Min บ่อย - หลีกเลี่ยงการ Copy Priority Queue (มีค่าใช้จ่ายสูง) ใช้ Reference หรือ Move
- สำหรับ Min Heap:
priority_queue<T, vector<T>, greater<T>> - Custom Struct: ใช้ Lambda หรือ Struct ที่มี
operator()