Hàng đợi ưu tiên là một kiểu dữ liệu trừu tượng nắm bắt ý tưởng về một vùng chứa có các phần tử có "mức độ ưu tiên" được gắn vào chúng. Phần tử có mức độ ưu tiên cao nhất luôn xuất hiện ở đầu hàng đợi. Nếu phần tử đó bị xóa, phần tử có mức độ ưu tiên cao nhất tiếp theo sẽ tiến lên phía trước.
Thư viện tiêu chuẩn C ++ định nghĩa một lớp ưu tiên mẫu, với các hoạt động sau:
push : Chèn một phần tử vào hàng đợi prioity.
top : Trả lại (mà không xóa nó) phần tử có mức ưu tiên cao nhất khỏi hàng đợi ưu tiên.
pop : Xóa phần tử có mức ưu tiên cao nhất khỏi hàng đợi ưu tiên.
size : Trả về số phần tử trong hàng đợi ưu tiên.
rỗng : Trả về true hoặc false tùy theo việc hàng đợi ưu tiên có trống hay không.
Đoạn mã sau cho biết cách tạo hai hàng đợi ưu tiên, một hàng có thể chứa số nguyên và một hàng khác có thể chứa chuỗi ký tự:
#include <queue>
priority_queue<int> q1;
priority_queue<string> q2;
Sau đây là một ví dụ về việc sử dụng hàng đợi ưu tiên:
#include <string>
#include <queue>
#include <iostream>
using namespace std;
int main()
{
piority_queue<string> pq;
pq.push("the quick");
pq.push("fox");
pq.push("jumped over");
pq.push("the lazy dog");
while (!pq.empty()) {
cout << pq.top() << endl;
pq.pop();
}
return 0;
}
Đầu ra của chương trình này là:
the quick
the lazy dog
jumped over
fox
Vì hàng đợi tuân theo quy luật ưu tiên, các chuỗi được in từ mức ưu tiên cao nhất đến thấp nhất.
Đôi khi người ta cần tạo một hàng đợi ưu tiên để chứa các đối tượng do người dùng xác định. Trong trường hợp này, hàng đợi ưu tiên cần biết tiêu chí so sánh được sử dụng để xác định đối tượng nào có mức ưu tiên cao nhất. Điều này được thực hiện nhờ một đối tượng hàm thuộc một lớp nạp chồng toán tử (). Quá tải () hoạt động như <với mục đích xác định mức độ ưu tiên. Ví dụ, giả sử chúng ta muốn tạo một hàng đợi ưu tiên để lưu trữ các đối tượng Thời gian. Đối tượng Thời gian có ba trường: giờ, phút, giây:
struct Time {
int h;
int m;
int s;
};
class CompareTime {
public:
bool operator()(Time& t1, Time& t2)
{
if (t1.h < t2.h) return true;
if (t1.h == t2.h && t1.m < t2.m) return true;
if (t1.h == t2.h && t1.m == t2.m && t1.s < t2.s) return true;
return false;
}
}
Hàng đợi ưu tiên để lưu trữ thời gian theo tiêu chí so sánh ở trên sẽ được định nghĩa như sau:
priority_queue<Time, vector<Time>, CompareTime> pq;
Here is a complete program:
#include <iostream>
#include <queue>
#include <iomanip>
using namespace std;
struct Time {
int h;
int m;
int s;
};
class CompareTime {
public:
bool operator()(Time& t1, Time& t2)
{
if (t1.h < t2.h) return true;
if (t1.h == t2.h && t1.m < t2.m) return true;
if (t1.h == t2.h && t1.m == t2.m && t1.s < t2.s) return true;
return false;
}
};
int main()
{
priority_queue<Time, vector<Time>, CompareTime> pq;
Time t[4] = { {3, 2, 40}, {3, 2, 26}, {5, 16, 13}, {5, 14, 20}};
for (int i = 0; i < 4; ++i)
pq.push(t[i]);
while (! pq.empty()) {
Time t2 = pq.top();
cout << setw(3) << t2.h << " " << setw(3) << t2.m << " " <<
setw(3) << t2.s << endl;
pq.pop();
}
return 0;
}
Chương trình in các thời gian từ muộn nhất đến sớm nhất:
5 16 13
5 14 20
3 2 40
3 2 26
Nếu chúng tôi muốn thời gian sớm nhất có mức độ ưu tiên cao nhất, chúng tôi sẽ xác định lại CompareTime như sau:
class CompareTime {
public:
bool operator()(Time& t1, Time& t2)
{
if (t2.h < t1.h) return true;
if (t2.h == t1.h && t2.m < t1.m) return true;
if (t2.h == t1.h && t2.m == t1.m && t2.s < t1.s) return true;
return false;
}
};