1. 程式人生 > >優先隊列priority_queue的簡單應用

優先隊列priority_queue的簡單應用

末尾 運行 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的簡單應用