首页 > 代码库 > 优先队列用法

优先队列用法

优先队列用法(即百家之所长写的)

在优先队列中,优先级高的元素先出队列。

标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

(1):

如果我们要把元素从小到大输出怎么办呢?

这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。

它的模板声明带有3个参数:

priority_queue<Type,Container,Functional>

其中

Type为数据类型;

Container必须是用数组实现的容器(保存数据),比如vector,deque但不能用list;

Functional为元素的比较方式。

 

STL里 面 默 认 用 的 是 vector。比 较 方 式 默 认 用 operator<, 所 以 如 果 你 把 后 面 两个参数省略的话,优先队列就是大顶堆,即头元素最大。

技术分享
 1 #include<iostream> 2  3 #include<functional> 4  5 #include<queue> 6  7 using namespace std; 8  9 int main()10 11 {12 13     const int len=5;14 15     int i;16 17     int a[len]={3,5,9,6,2};18 19  20 21     priority_queue<int> qi;22 23     for(i=0;i<len;i++)24 25         qi.push(a[i]);26 27     for(i=0;i<len;i++)28 29     {30 31         cout<<qi.top()<<" ";32 33         qi.pop();34 35     }36 37     return 0;38 39 }
大顶堆

 

例1输出结果为:9 6 5 3 2

 

小顶堆:

则一般要把模板的3个参数都带进去。

STL里面定义了一个仿函数greater<>,对于基本类型可以用这个仿函数声明

小顶堆:

priority_queue<int, vector<int>, greater<int> >qi2

故示例2中输出结果为:2 3 5 6 9

 

(2):

自定义优先级一:

 

struct node

{

    friend bool operator< (node n1, node n2)

    {

        return n1.priority < n2.priority;

    }

    int priority;

    int value;

};

在该结构中,value为值,priority为优先级。

通过自定义operator<操作符来比较元素中的优先级。

 

//代码清单

 

技术分享
 1 #include<iostream> 2  3 #include<functional> 4  5 #include<queue> 6  7 using namespace std; 8  9 struct node10 11 {12 13     friend bool operator< (node n1, node n2)14 15     {16 17         return n1.priority < n2.priority;18 19     }20 21     int priority;22 23     int value;24 25 };26 27 int main()28 29 {30 31     const int len = 5;32 33     int i;34 35  36 37     priority_queue<node> qn;38 39     node b[len]={{6,1},{9,5},{2,3},{8,2},{1,4}};40 41   /*  b[0].priority = 6; b[0].value = http://www.mamicode.com/1;>42 43     b[1].priority = 9; b[1].value = http://www.mamicode.com/5;>44 45     b[2].priority = 2; b[2].value = http://www.mamicode.com/3;>46 47     b[3].priority = 8; b[3].value = http://www.mamicode.com/2;>48 49     b[4].priority = 1; b[4].value = http://www.mamicode.com/4;*/50 51  52 53  54 55     for(i = 0; i < len; i++)56 57         qn.push(b[i]);58 59     cout<<"优先级"<<\t<<""<<endl;60 61     for(i = 0; i < len; i++)62 63     {64 65         cout<<qn.top().priority<<\t<<qn.top().value<<endl;66 67         qn.pop();68 69     }70 71     return 0;72 73 }
自定义权值

 

输出结果为:

优先级  值

9          5

8          2

6          1

2          3

1          4

 

自定义优先级二:

技术分享
  1 #include<stdio.h>  2   3 #include<functional>  4   5 #include<queue>  6   7 #include<vector>  8   9 using namespace std; 10  11   12  13 struct cmp1 14  15 { 16  17     bool operator()(int &a,int &b) 18  19     { 20  21         return a>b;//最小值优先 22  23     } 24  25 }; 26  27 struct cmp2 28  29 { 30  31     bool operator()(int &a,int &b) 32  33     { 34  35         return a<b;//最大值优先 36  37     } 38  39 }; 40  41 struct number1 42  43 { 44  45     int x; 46  47     bool operator<(const number1&a)const 48  49     { 50  51         return x>a.x;//最小值优先 52  53     } 54  55 }; 56  57 struct number2 58  59 { 60  61     int x; 62  63     bool operator<(const number2&a)const 64  65     { 66  67         return x<a.x;//最大值优先 68  69     } 70  71 }; 72  73 int a[]={14,10,56,7,83,22,36,91,3,47,72,0}; 74  75 number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0}; 76  77 number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0}; 78  79   80  81 int main() 82  83 { 84  85     int i=0; 86  87     priority_queue<int,vector<int>,cmp1>que1;//最小值优先 88  89     priority_queue<int,vector<int>,cmp2>que2;//最大值优先 90  91     priority_queue<int,vector<int>,less<int> >que4;//最大值优先 92  93     priority_queue<number1>que5;//最小值优先 94  95     priority_queue<number2>que6;//最大值优先 96  97   98  99     for(i=0;a[i];i++)100 101     {102 103         que1.push(a[i]);104 105         que2.push(a[i]);106 107         que4.push(a[i]);108 109     }110 111     for(i=0;num1[i].x;i++)112 113         que5.push(num1[i]);114 115     for(i=0;num2[i].x;i++)116 117         que6.push(num2[i]);118 119  120 121     printf("采用结构体自定义优先级方式一:\n(priority_queue<int,vector<int>,cmp1/cmp2>que1;)\n");122 123     printf("Queue 1\n");124 125     while(!que1.empty())126 127     {128 129         printf("%3d",que1.top());130 131         que1.pop();132 133     }134 135     printf("\n");136 137     printf("Queue 2\n");138 139     while(!que2.empty())140 141     {142 143         printf("%3d",que2.top());144 145         que2.pop();146 147     }148 149     printf("\n\n");150 151  152 153     printf("采用头文件\"functional\"内定义优先级:\n(priority_queue<int,vector<int>,less<int> >que4;)\n");154 155     printf("Queue 4:\n");156 157     while(!que4.empty())158 159     {160 161         printf("%3d",que4.top());162 163         que4.pop();164 165     }166 167     printf("\n\n");168 169  170 171     printf("采用结构体自定义优先级方式二:\n(priority_queue<number1/number2>que;)\n");172 173     printf("Queue 5:\n");174 175     while(!que5.empty())176 177     {178 179         printf("%3d",que5.top());180 181         que5.pop();182 183     }184 185     printf("\n");186 187  188 189     printf("Queue 6:\n");190 191     while(!que6.empty())192 193     {194 195         printf("%3d",que6.top());196 197         que6.pop();198 199     }200 201     printf("\n");202 203     return 0;204 205 }
另两种自定义写法

 

 

优先队列用法