優先隊列priority_queue的簡單應用
阿新 • • 發佈:2018-04-30
末尾 運行 back ++ () 註意 return 容器 turn
優先隊列
引入
優先隊列是一種特殊以及強大的隊列。
那麽優先隊列是什麽呢?
說白了,就是一種功能強大的隊列。
它的功能強大在哪裏呢?
四個字:自動排序。
優先隊列的頭文件&&聲明
頭文件:
#include<queue> using namespace std;
其次,一個優先隊列聲明的基本格式是:
priority_queue<結構類型> 隊列名;
priority_queue<int> i; priority_queue<double> i;
不過這是新手級別的,下面的是大佬級別的:
priority_queue <node> q;//node是一個結構體 //結構體裏重載了‘<’小於符號 priority_queue <int,vector<int>,greater<int> > q; //不需要#include<vector>頭文件 //註意後面兩個“>”不要寫在一起,“>>”是右移運算符 priority_queue <int,vector<int>,less<int> >q;
優先隊列的基本操作
與隊列差不多:
q.size();//返回q裏元素個數 q.empty();//返回q是否為空,空則返回1,否則返回0 q.push(k);//在q的末尾插入k q.pop();//刪掉q的第一個元素 q.top();//返回q的第一個元素 q.back();//返回q的末尾元素
優先隊列的特性
默認的優先隊列(非結構體結構)
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
也就是說,它是按從大到小排序的!
默認的優先隊列(結構體,重載小於)
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); } }
程序大意就是插入(10,100),(12,60),(14,40),(6,20),(8,20)這五個node。
再來看看它的輸出: (14,40) (12,60) (10,100) (8,20) (6,80)
它也是按照重載後的小於規則,從大到小排序的。
less和greater優先隊列
priority_queue <int,vector<int>,less<int> > p; priority_queue <int,vector<int>,greater<int> > q;
less是從大到小,greater是從小到大。
同時還可以自己定義規則 cmp;
2、自定義優先級:
struct cmp { operator bool ()(int x, int y) { return x > y; // x小的優先級高 //也可以寫成其他方式,如: return p[x] > p[y];表示p[i]小的優先級高 } }; priority_queue<int, vector<int>, cmp> q; //定義方法 //其中,第二個參數為容器類型。第三個參數為比較函數。3、結構體聲明方式:
struct node { int x, y; friend bool operator < (node a, node b) { return a.x > b.x; //結構體中,x小的優先級高 } }; priority_queue<node>q; //定義方法 //在該結構中,y為值, x為優先級。 //通過自定義operator<操作符來比較元素中的優先級。 //在重載”<”時,最好不要重載”>”,可能會發生編譯錯誤/*優先隊列的基本使用 2017/8/1 xzxl*/ #include<stdio.h> #include<functional> #include<queue> #include<vector> using namespace std; //定義結構,使用運算符重載,自定義優先級1 struct cmp1{ bool operator ()(int &a,int &b){ return a>b;//最小值優先 } }; struct cmp2{ bool operator ()(int &a,int &b){ return a<b;//最大值優先 } }; //定義結構,使用運算符重載,自定義優先級2 struct number1{ int x; bool operator < (const number1 &a) const { return x>a.x;//最小值優先 } }; struct number2{ int x; bool operator < (const number2 &a) const { return x<a.x;//最大值優先 } }; int a[]={14,10,56,7,83,22,36,91,3,47,72,0}; number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0}; number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0}; int main() { priority_queue<int>que;//采用默認優先級構造隊列 priority_queue<int,vector<int>,cmp1>que1;//最小值優先 priority_queue<int,vector<int>,cmp2>que2;//最大值優先 priority_queue<int,vector<int>,greater<int> >que3;//註意“>>”會被認為錯誤, //這是右移運算符,所以這裏用空格號隔開 priority_queue<int,vector<int>,less<int> >que4;////最大值優先 priority_queue<number1>que5; priority_queue<number2>que6; int i; for(i=0;a[i];i++){ que.push(a[i]); que1.push(a[i]); que2.push(a[i]); que3.push(a[i]); que4.push(a[i]); } for(i=0;num1[i].x;i++) que5.push(num1[i]); for(i=0;num2[i].x;i++) que6.push(num2[i]); printf("采用默認優先關系:\n(priority_queue<int>que;)\n"); printf("Queue 0:\n"); while(!que.empty()){ printf("%3d",que.top()); que.pop(); } puts(""); puts(""); printf("采用結構體自定義優先級方式一:\n(priority_queue<int,vector<int>,cmp>que;)\n"); printf("Queue 1:\n"); while(!que1.empty()){ printf("%3d",que1.top()); que1.pop(); } puts(""); printf("Queue 2:\n"); while(!que2.empty()){ printf("%3d",que2.top()); que2.pop(); } puts(""); puts(""); printf("采用頭文件\"functional\"內定義優先級:\n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)\n"); printf("Queue 3:\n"); while(!que3.empty()){ printf("%3d",que3.top()); que3.pop(); } puts(""); printf("Queue 4:\n"); while(!que4.empty()){ printf("%3d",que4.top()); que4.pop(); } puts(""); puts(""); printf("采用結構體自定義優先級方式二:\n(priority_queue<number>que)\n"); printf("Queue 5:\n"); while(!que5.empty()){ printf("%3d",que5.top()); que5.pop(); } puts(""); printf("Queue 6:\n"); while(!que6.empty()){ printf("%3d",que6.top()); que6.pop(); } puts(""); return 0; } /* 運行結果 : 采用默認優先關系: (priority_queue<int>que;) Queue 0: 83 72 56 47 36 22 14 10 7 3 采用結構體自定義優先級方式一: (priority_queue<int,vector<int>,cmp>que;) Queue 1: 7 10 14 22 36 47 56 72 83 91 Queue 2: 83 72 56 47 36 22 14 10 7 3 采用頭文件"functional"內定義優先級: (priority_queue<int,vector<int>,greater<int>/less<int> >que;) Queue 3: 7 10 14 22 36 47 56 72 83 91 Queue 4: 83 72 56 47 36 22 14 10 7 3 采用結構體自定義優先級方式二: (priority_queue<number>que) Queue 5: 7 10 14 22 36 47 56 72 83 91 Queue 6: 83 72 56 47 36 22 14 10 7 3 */
優先隊列priority_queue的簡單應用