Eine Prioritätswarteschlange ist ein abstrakter Datentyp, der die Idee eines Containers erfasst, an dessen Elemente "Prioritäten" angehängt sind. Ein Element mit der höchsten Priorität wird immer vorne in der Warteschlange angezeigt. Wenn dieses Element entfernt wird, rückt das Element mit der nächsthöheren Priorität nach vorne vor.
Die C ++ - Standardbibliothek definiert eine Klassenvorlage priority_queue mit den folgenden Operationen:
push : Fügen Sie ein Element in die Prioity-Warteschlange ein.
top : Gibt ein Element mit der höchsten Priorität aus der Prioritätswarteschlange zurück (ohne es zu entfernen).
pop : Entfernen Sie ein Element mit der höchsten Priorität aus der Prioritätswarteschlange.
Größe : Gibt die Anzahl der Elemente in der Prioritätswarteschlange zurück.
leer : Gibt true oder false zurück, je nachdem, ob die Prioritätswarteschlange leer ist oder nicht.
Das folgende Codefragment zeigt, wie zwei Prioritätswarteschlangen erstellt werden, eine mit Ganzzahlen und eine mit Zeichenfolgen:
#include <queue>
priority_queue<int> q1;
priority_queue<string> q2;
Das folgende Beispiel zeigt die Verwendung der Prioritätswarteschlange:
#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;
}
Die Ausgabe dieses Programms ist:
the quick
the lazy dog
jumped over
fox
Da eine Warteschlange einer Prioritätsdisziplin folgt, werden die Zeichenfolgen von der höchsten zur niedrigsten Priorität gedruckt.
Manchmal muss eine Prioritätswarteschlange erstellt werden, die benutzerdefinierte Objekte enthält. In diesem Fall muss die Prioritätswarteschlange das Vergleichskriterium kennen, anhand dessen bestimmt wird, welche Objekte die höchste Priorität haben. Dies geschieht mit Hilfe eines Funktionsobjekts, das zu einer Klasse gehört, die den Operator () überlastet. Das überladene () fungiert als <, um Prioritäten zu bestimmen. Angenommen, wir möchten eine Prioritätswarteschlange zum Speichern von Zeitobjekten erstellen. Ein Zeitobjekt hat drei Felder: Stunden, Minuten, Sekunden:
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;
}
}
Eine Prioritätswarteschlange zum Speichern von Zeiten gemäß dem obigen Vergleichskriterium würde wie folgt definiert:
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;
}
Das Programm druckt die Zeiten von spätestens bis frühestens:
5 16 13
5 14 20
3 2 40
3 2 26
Wenn wir möchten, dass früheste Zeiten die höchste Priorität haben, würden wir CompareTime folgendermaßen neu definieren:
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;
}
};