Để giải quyết bài toán này, chúng ta sẽ sử dụng một danh sách liên kết để lưu trữ các yêu cầu in và sắp xếp chúng theo độ ưu tiên và thứ tự nhập vào.
Đối với phương thức addNewRequest, chúng ta sẽ tìm kiếm vị trí thích hợp để chèn yêu cầu in vào danh sách theo độ ưu tiên và thứ tự nhập vào. Sau đó, chúng ta sẽ thêm yêu cầu in mới vào danh sách liên kết.
Đối với phương thức print, chúng ta sẽ kiểm tra xem danh sách liên kết có rỗng hay không. Nếu danh sách liên kết rỗng, chúng ta sẽ in ra thông báo "No file to print" kèm xuống dòng. Ngược lại, chúng ta sẽ in tên file đầu tiên trong danh sách, sau đó xóa nó ra khỏi danh sách.
Dưới đây là một cách để hiện thực class PrinterQueue thỏa mãn yêu cầu bài toán:
arduino#include <iostream>
#include <string>
using namespace std;
class PrinterQueue
{
private:
struct PrintRequest {
int priority;
string fileName;
PrintRequest* next;
};
PrintRequest* head = nullptr;
int count = 0;
public:
void addNewRequest(int priority, string fileName)
{
if (count == 100) {
cout << "Queue is full" << endl;
return;
}
PrintRequest* newRequest = new PrintRequest();
newRequest->priority = priority;
newRequest->fileName = fileName;
newRequest->next = nullptr;
if (head == nullptr) {
head = newRequest;
} else {
PrintRequest* curr = head;
PrintRequest* prev = nullptr;
while (curr != nullptr && curr->priority >= priority) {
prev = curr;
curr = curr->next;
}
if (prev == nullptr) {
newRequest->next = head;
head = newRequest;
} else {
prev->next = newRequest;
newRequest->next = curr;
}
}
count++;
}
void print()
{
if (head == nullptr) {
cout << "No file to print" << endl;
return;
}
cout << head->fileName << endl;
PrintRequest* temp = head;
head = head->next;
delete temp;
count--;
}
};
Trong ví dụ trên, chúng ta sử dụng một danh sách liên kết đơn để lưu trữ các yêu cầu in. Mỗi yêu cầu in được biểu diễn bởi một nút trong danh sách liên kết, chứa độ ưu tiên và tên file.
Trong phương thức addNewRequest, chúng ta sử dụng một vòng lặp để tìm kiếm vị trí thích hợp để chèn yêu cầu in mới vào danh sách