#include <iostream>
using namespace std;
// Cấu trúc một nút trong danh sách liên kết đôi
struct Node {
int data;
Node* next;
Node* prev;
Node(int value) {
data = value;
next = prev = nullptr;
}
};
// Lớp hàng đợi sử dụng danh sách liên kết đôi
class Deque {
private:
Node* front;
Node* rear;
public:
Deque() {
front = rear = nullptr;
}
// Kiểm tra hàng đợi rỗng
bool isEmpty() {
return front == nullptr;
}
// Thêm vào đầu hàng đợi
void enqueueFront(int value) {
Node* newNode = new Node(value);
if (isEmpty()) {
front = rear = newNode;
} else {
newNode->next = front;
front->prev = newNode;
front = newNode;
}
cout << "Đã thêm " << value << " vào đầu hàng đợi.\n";
}
void enqueueRear(int value) {
Node* newNode = new Node(value);
if (isEmpty()) {
front = rear = newNode;
} else {
rear->next = newNode;
newNode->prev = rear;
rear = newNode;
}
cout << "Đã thêm " << value << " vào cuối hàng đợi.\n";
}
void dequeueFront() {
if (isEmpty()) {
cout << "Hàng đợi rỗng, không thể xóa!\n";
return;
}
Node* temp = front;
front = front->next;
if (front == nullptr) {
rear = nullptr;
} else {
front->prev = nullptr;
}
cout << "Đã xóa " << temp->data << " khỏi đầu hàng đợi.\n";
delete temp;
}
void dequeueRear() {
if (isEmpty()) {
cout << "Hàng đợi rỗng, không thể xóa!\n";
return;
}
Node* temp = rear;
rear = rear->prev;
if (rear == nullptr) {
front = nullptr;
} else {
rear->next = nullptr;
}
cout << "Đã xóa " << temp->data << " khỏi cuối hàng đợi.\n";
delete temp;
}
void printQueue() {
if (isEmpty()) {
cout << "Hàng đợi đang rỗng.\n";
return;
}
Node* temp = front;
cout << "Hàng đợi: ";
while (temp) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
~Deque() {
while (!isEmpty()) {
dequeueFront();
}
}
};
// Chương trình kiểm tra
int main() {
Deque dq;
dq.enqueueFront(10);
dq.enqueueRear(20);
dq.enqueueFront(5);
dq.enqueueRear(30);
dq.printQueue(); // Output: 5 10 20 30
dq.dequeueFront(); // Xóa 5
dq.printQueue(); // Output: 10 20 30
dq.dequeueRear(); // Xóa 30
dq.printQueue(); // Output: 10 20
dq.dequeueFront(); // Xóa 10
dq.dequeueRear(); // Xóa 20
dq.dequeueFront(); // Xóa khi rỗng
return 0;
}