1. 程式人生 > >優先佇列——Priority_Queue 詳解

優先佇列——Priority_Queue 詳解

一、入門介紹

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是從小到大。