zoukankan      html  css  js  c++  java
  • 优先队列(转载)

      1 优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~
      2 百度百科上这样描述的:
      3   优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素
      4   优先队列的类定义  
      5   优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除.在最小优先队列(min priorityq u e u e)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行. 
      6 优先队列,其构造及具体实现我们可以先不用深究,我们现在只需要了解其特性,及在做题中的用法,相信,看过之后你会收获不少。
      7 使用优先队列,首先要包函STL头文件"queue"  8 以一个例子来解释吧(呃,写完才发现,这个代码包函了几乎所有我们要用到的用法,仔细看看吧):
      9 view plaincopy to clipboardprint?
     10 /*优先队列的基本使用    2010/7/24    dooder*/  
     11 #include<stdio.h>  
     12 #include<functional>  
     13 #include<queue>  
     14 #include<vector>  
     15 using namespace std;  
     16 //定义结构,使用运算符重载,自定义优先级1  
     17 struct cmp1{  
     18     bool operator ()(int &a,int &b){  
     19         return a>b;//最小值优先  
     20     }  
     21 };  
     22 struct cmp2{  
     23     bool operator ()(int &a,int &b){  
     24         return a<b;//最大值优先  
     25     }  
     26 };  
     27 //定义结构,使用运算符重载,自定义优先级2  
     28 struct number1{  
     29     int x;  
     30     bool operator < (const number1 &a) const {  
     31         return x>a.x;//最小值优先  
     32     }  
     33 };  
     34 struct number2{  
     35     int x;  
     36     bool operator < (const number2 &a) const {  
     37         return x<a.x;//最大值优先  
     38     }  
     39 };  
     40 int a[]={14,10,56,7,83,22,36,91,3,47,72,0};  
     41 number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0};  
     42 number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0};  
     43   
     44 int main()  
     45 {   priority_queue<int>que;//采用默认优先级构造队列  
     46   
     47     priority_queue<int,vector<int>,cmp1>que1;//最小值优先  
     48     priority_queue<int,vector<int>,cmp2>que2;//最大值优先  
     49   
     50     priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”会被认为错误,  
     51                                                       //这是右移运算符,所以这里用空格号隔开  
     52     priority_queue<int,vector<int>,less<int> >que4;////最大值优先  
     53   
     54     priority_queue<number1>que5;  
     55     priority_queue<number2>que6;  
     56   
     57     int i;  
     58     for(i=0;a[i];i++){  
     59         que.push(a[i]);  
     60         que1.push(a[i]);  
     61         que2.push(a[i]);  
     62         que3.push(a[i]);  
     63         que4.push(a[i]);  
     64     }  
     65     for(i=0;num1[i].x;i++)  
     66         que5.push(num1[i]);  
     67     for(i=0;num2[i].x;i++)  
     68         que6.push(num2[i]);  
     69   
     70   
     71     printf("采用默认优先关系:
    (priority_queue<int>que;)
    ");  
     72     printf("Queue 0:
    ");  
     73     while(!que.empty()){  
     74         printf("%3d",que.top());  
     75         que.pop();  
     76     }  
     77     puts("");  
     78     puts("");  
     79   
     80     printf("采用结构体自定义优先级方式一:
    (priority_queue<int,vector<int>,cmp>que;)
    ");  
     81     printf("Queue 1:
    ");  
     82     while(!que1.empty()){  
     83         printf("%3d",que1.top());  
     84         que1.pop();  
     85     }  
     86     puts("");  
     87     printf("Queue 2:
    ");  
     88     while(!que2.empty()){  
     89         printf("%3d",que2.top());  
     90         que2.pop();  
     91     }  
     92     puts("");  
     93     puts("");  
     94     printf("采用头文件"functional"内定义优先级:
    (priority_queue<int,vector<int>,greater<int>/less<int> >que;)
    ");  
     95     printf("Queue 3:
    ");  
     96     while(!que3.empty()){  
     97         printf("%3d",que3.top());  
     98         que3.pop();  
     99     }  
    100     puts("");  
    101     printf("Queue 4:
    ");  
    102     while(!que4.empty()){  
    103         printf("%3d",que4.top());  
    104         que4.pop();  
    105     }  
    106     puts("");  
    107     puts("");  
    108     printf("采用结构体自定义优先级方式二:
    (priority_queue<number>que)
    ");  
    109     printf("Queue 5:
    ");  
    110     while(!que5.empty()){  
    111         printf("%3d",que5.top());  
    112         que5.pop();  
    113     }  
    114     puts("");  
    115     printf("Queue 6:
    ");  
    116     while(!que6.empty()){  
    117         printf("%3d",que6.top());  
    118         que6.pop();  
    119     }  
    120     puts("");  
    121     return 0;  
    122 }  
    123 /* 
    124 运行结果 : 
    125 采用默认优先关系: 
    126 (priority_queue<int>que;) 
    127 Queue 0: 
    128 83 72 56 47 36 22 14 10  7  3 
    129  
    130 采用结构体自定义优先级方式一: 
    131 (priority_queue<int,vector<int>,cmp>que;) 
    132 Queue 1: 
    133  7 10 14 22 36 47 56 72 83 91 
    134 Queue 2: 
    135 83 72 56 47 36 22 14 10  7  3 
    136  
    137 采用头文件"functional"内定义优先级: 
    138 (priority_queue<int,vector<int>,greater<int>/less<int> >que;) 
    139 Queue 3: 
    140  7 10 14 22 36 47 56 72 83 91 
    141 Queue 4: 
    142 83 72 56 47 36 22 14 10  7  3 
    143  
    144 采用结构体自定义优先级方式二: 
    145 (priority_queue<number>que) 
    146 Queue 5: 
    147  7 10 14 22 36 47 56 72 83 91 
    148 Queue 6: 
    149 83 72 56 47 36 22 14 10  7  3 
    150 */  
    151 运行结果:
    152 采用默认优先关系:
    153 (priority_queue<int>que;)
    154 Queue 0:
    155 83 72 56 47 36 22 14 10  7  3
    156 采用结构体自定义优先级方式一:
    157 (priority_queue<int,vector<int>,cmp>que;)
    158 Queue 1:
    159  7 10 14 22 36 47 56 72 83 91
    160 Queue 2:
    161 83 72 56 47 36 22 14 10  7  3
    162 采用头文件"functional"内定义优先级:
    163 (priority_queue<int,vector<int>,greater<int>/less<int> >que;)
    164 Queue 3:
    165  7 10 14 22 36 47 56 72 83 91
    166 Queue 4:
    167 83 72 56 47 36 22 14 10  7  3
    168 采用结构体自定义优先级方式二:
    169 (priority_queue<number>que)
    170 Queue 5:
    171  7 10 14 22 36 47 56 72 83 91
    172 Queue 6:
    173 83 72 56 47 36 22 14 10  7  3
    174 好了,如果你仔细看完了上面的代码,那么你就可以基本使用优先队列了,下面给出一些我做题中有过的一些应用,希望能给大家带来一些启
    175 示~
    
    油!油!you@
  • 相关阅读:
    使用javap分析Java的字符串操作
    使用javap深入理解Java整型常量和整型变量的区别
    分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型
    Java动态代理之InvocationHandler最简单的入门教程
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5019050.html
Copyright © 2011-2022 走看看