एक प्राथमिकता कतार एक सार डेटा प्रकार है जो एक कंटेनर के विचार को कैप्चर करता है जिसके तत्वों में "प्राथमिकताएं" उनसे जुड़ी होती हैं। सर्वोच्च प्राथमिकता का एक तत्व हमेशा कतार के सामने दिखाई देता है। यदि वह तत्व हटा दिया जाता है, तो अगला सर्वोच्च प्राथमिकता तत्व सामने वाले को आगे बढ़ाता है।
C ++ मानक पुस्तकालय निम्नलिखित कार्यों के साथ एक वर्ग टेम्पलेट प्राथमिकता_ चक्र को परिभाषित करता है:
धक्का : एक तत्व को पवित्रता कतार में डालें।
शीर्ष : वापसी (इसे हटाए बिना) प्राथमिकता कतार से सर्वोच्च प्राथमिकता वाला तत्व।
पॉप : प्राथमिकता कतार से एक सर्वोच्च प्राथमिकता तत्व निकालें।
आकार : प्राथमिकता कतार में तत्वों की संख्या लौटाएं।
खाली : प्राथमिकता कतार के खाली होने या न होने के अनुसार सही या गलत होने पर लौटें।
निम्न कोड स्निपेट दिखाता है कि दो प्राथमिकता वाले कतारों का निर्माण कैसे किया जाता है, एक जिसमें पूर्णांक हो सकते हैं और एक अन्य जिसमें वर्ण तार हो सकते हैं:
#include <queue>
priority_queue<int> q1;
priority_queue<string> q2;
निम्नलिखित प्राथमिकता कतार उपयोग का एक उदाहरण है:
#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;
}
इस कार्यक्रम का आउटपुट है:
the quick
the lazy dog
jumped over
fox
चूँकि एक कतार एक प्राथमिकता अनुशासन का पालन करती है, तार उच्चतम से सबसे कम प्राथमिकता तक मुद्रित होते हैं।
कभी-कभी किसी को उपयोगकर्ता परिभाषित वस्तुओं को शामिल करने के लिए प्राथमिकता कतार बनाने की आवश्यकता होती है। इस मामले में, प्राथमिकता कतार को यह निर्धारित करने के लिए उपयोग की जाने वाली तुलना मानदंड को जानने की जरूरत है कि किन वस्तुओं में सर्वोच्च प्राथमिकता है। यह एक वर्ग से संबंधित एक फ़ंक्शन ऑब्जेक्ट के माध्यम से किया जाता है जो ऑपरेटर () को ओवरलोड करता है। अधिभार () प्राथमिकता निर्धारित करने के उद्देश्य से <के रूप में कार्य करता है। उदाहरण के लिए, मान लें कि हम टाइम ऑब्जेक्ट्स को स्टोर करने के लिए प्राथमिकता कतार बनाना चाहते हैं। एक समय वस्तु के तीन क्षेत्र होते हैं: घंटे, मिनट, सेकंड:
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;
}
}
उपरोक्त तुलना कसौटी के अनुसार समय को स्टोर करने के लिए एक प्राथमिकता कतार निम्नानुसार परिभाषित की जाएगी:
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;
}
कार्यक्रम नवीनतम से जल्द से जल्द प्रिंट करता है:
5 16 13
5 14 20
3 2 40
3 2 26
यदि हम चाहते थे कि जल्द से जल्द सर्वोच्च प्राथमिकता हो, तो हम इस तरह की तुलना को फिर से परिभाषित करेंगे:
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;
}
};