優先佇列——Priority_Queue 詳解
阿新 • • 發佈:2018-11-09
一、入門介紹
1、 優先佇列是一種特殊的佇列,這種佇列會自動的把佇列裡的數排序(預設從大到小,使用“<”判斷),而且還可以把數按照特定的方法排列!(包括結構體和過載"<")
2、 優先佇列的標頭檔案,需要包括:
#include<queue>
using namespace std;
宣告: 一個優先佇列宣告的基本格式是:
priority_queue<結構型別> 佇列名;
比如:
priority_queue <int> i;
priority_queue <double> d;
不過,我們最為常用的是這幾種:
priority_queue <node> q; //node是一個結構體 //結構體裡過載了‘<’小於符號 priority_queue <int,vector<int>,greater<int> > q; // 從小到大排序(陣列) priority_queue <int,vector<int>,less<int> >q; // 從大到小排序 //不需要#include<vector>標頭檔案 //注意後面兩個“>”不要寫在一起,“>>”是右移運算子
二、優先佇列的基本操作:
1、以一個名為q的優先佇列為例:
q.size(); //返回q裡元素個數
q.empty(); //返回q是否為空,空則返回1,否則返回0
q.push(k); //在q的末尾插入k
q.pop(); //刪掉q的第一個元素
q.top(); //返回q的第一個元素
q.back(); //返回q的末尾元素
2、優先佇列的特性
自動排序。
怎麼個排法呢? 在這裡介紹一下:
(1)、預設的優先佇列(非結構體結構)
priority_queue <int> q;
簡單操作:
#include<cstdio> #include<queue> using namespace std; priority_queue <int> q; int main() { q.push(10),q.push(8),q.push(12),q.push(14),q.push(6); while(!q.empty()) printf("%d ",q.top()),q.pop(); }
程式大意就是在這個優先佇列裡依次插入10、8、12、14、6,再輸出。
結果是什麼呢?
14 12 10 8 6
也就是說,它是按從大到小排序的!
(2)、預設的優先佇列(結構體,過載小於)
先看看這個結構體是什麼。
struct node
{
int x,y;
bool operator < (const node & a) const
{
return x<a.x;
}
};
這個node結構體有兩個成員,x和y,它的小於規則是x小者小。
再來看看驗證程式:
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int x,y;
bool operator < (const node & a) const
{
return x<a.x;
}
}k;
priority_queue <node> q;
int main()
{
k.x=10,k.y=100; q.push(k);
k.x=12,k.y=60; q.push(k);
k.x=14,k.y=40; q.push(k);
k.x=6,k.y=80; q.push(k);
k.x=8,k.y=20; q.push(k);
while(!q.empty())
{
node m=q.top(); q.pop();
printf("(%d,%d) ",m.x,m.y);
}
}
(3)、less和greater優先佇列(多使用這一個)
還是以int為例,先來宣告:
priority_queue <int,vector<int>,less<int> > p; // 陣列從大到小排序
priority_queue <int,vector<int>,greater<int> > q; // 從小到大排序
CODE:
#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
int a[5]={10,12,14,6,8};
int main()
{
for(int i=0;i<5;i++)
p.push(a[i]),q.push(a[i]);
printf("less<int>:")
while(!p.empty())
printf("%d ",p.top()),p.pop();
pritntf("\ngreater<int>:")
while(!q.empty())
printf("%d ",q.top()),q.pop();
}
結果:
less:14 12 10 8 6
greater:6 8 10 12 14
所以,我們可以知道,less是從大到小,greater是從小到大。