Queue (คิว) เป็นโครงสร้างข้อมูลแบบ FIFO (First In, First Out) - ข้อมูลที่เข้าไปก่อนจะออกก่อน
โครงสร้าง Node สำหรับ Linked List Queue
struct Node {
int data;
Node* next;
};
Node* front = nullptr; // หน้าคิว
Node* rear = nullptr; // ท้ายคิว
โค้ดโปรแกรม Queue ด้วย Linked List
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* front = nullptr;
Node* rear = nullptr;
void enqueue(int val) {
Node* newNode = new Node();
newNode->data = val;
newNode->next = nullptr;
if (rear == nullptr) { // คิวว่าง
front = rear = newNode;
} else {
rear->next = newNode; // เพิ่มท้ายคิว
rear = newNode;
}
cout << val << " enqueued." << endl;
}
void dequeue() {
if (front == nullptr) {
cout << "Queue Underflow" << endl;
return;
}
Node* temp = front;
cout << "Dequeued: " << front->data << endl;
front = front->next;
if (front == nullptr) // คิวว่างหลังลบ
rear = nullptr;
delete temp; // ปล่อยหน่วยความจำ
}
void display() {
if (front == nullptr) {
cout << "Queue is empty" << endl;
return;
}
Node* temp = front;
cout << "Queue: ";
while (temp != nullptr) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
int main() {
int choice, val;
do {
cout << "\n1. Enqueue\n2. Dequeue\n3. Display\n4. Exit\nChoice: ";
cin >> choice;
switch (choice) {
case 1:
cout << "Enter value: ";
cin >> val;
enqueue(val);
break;
case 2:
dequeue();
break;
case 3:
display();
break;
case 4:
cout << "Exiting..." << endl;
break;
default:
cout << "Invalid choice!" << endl;
}
} while (choice != 4);
// ทำความสะอาดหน่วยความจำที่เหลือ
while (front != nullptr) dequeue();
return 0;
}
ผลลัพธ์ตัวอย่าง
1. Enqueue 2. Dequeue 3. Display 4. Exit Choice: 1 Enter value: 10 10 enqueued. Choice: 1 Enter value: 20 20 enqueued. Choice: 3 Queue: 10 20 Choice: 2 Dequeued: 10 Choice: 3 Queue: 20 Choice: 4 Exiting...
การทำงานของแต่ละฟังก์ชัน
| ฟังก์ชัน | หน้าที่ | Time Complexity |
|---|---|---|
| enqueue() | เพิ่มข้อมูลท้ายคิว | O(1) |
| dequeue() | ลบข้อมูลหน้าคิว | O(1) |
| display() | แสดงข้อมูลทั้งคิว | O(n) |
ข้อดีของ Linked List Queue
- ขนาดไดนามิก - ไม่ต้องกำหนดขนาดล่วงหน้า
- ไม่มีปัญหา Overflow (จนกว่าหน่วยความจำจะเต็ม)
- ใช้หน่วยความจำประหยัด (จองเฉพาะที่ใช้)
ข้อควรระวัง
- ต้อง
deletenode ที่ลบออก เพื่อป้องกัน Memory Leak - ใช้
nullptrแทน NULL (C++11 ขึ้นไป) - ควรทำ destructor ทำความสะอาดเมื่อจบโปรแกรม