C++ 优先队列应用方法 浅析

【摘要】

本文从两个方面介绍优先队列,1.优先队列的常见函数;2.优先队列代码实现:堆排序和哈夫曼树。

【正文】

一.优先队列函数列表

  • empty() 如果优先队列为空,则返回真
  • pop() 删除第一个元素
  • push() 加入一个元素
  • size() 返回优先队列中拥有的元素的个数
  • top() 返回优先队列中有最高优先级的元素

二.优先队列代码用例

示例1
#include <iostream>
#include <queue>
#include <deque>
#include <vector>
#include <functional>
using namespace std;  

#if _MSC_VER > 1020 // if VC++ version is > 4.2
 using namespace std; // std c++ libs implemented in std
 #endif  

// Using priority_queue with deque
// Use of function greater sorts the items in ascending order
typedef deque<int, allocator<int> > INTDQU;
typedef priority_queue<int,INTDQU, greater<int> > INTPRQUE;  

// Using priority_queue with vector
// Use of function less sorts the items in descending order
typedef vector<char, allocator<char> > CHVECTOR;
typedef priority_queue<char,CHVECTOR,less<char> > CHPRQUE;  

void main(void)
{  

 int size_q;
 INTPRQUE q;
 CHPRQUE p;  

 // Insert items in the priority_queue(uses deque)
 q.push(42);
 q.push(100);
 q.push(49);
 q.push(201);  

 // Output the item at the top using top()
 cout << q.top() << endl;
 // Output the size of priority_queue
 size_q = q.size();
 cout << "size of q is:" << size_q << endl;
 // Output items in priority_queue using top()
 // and use pop() to get to next item until
 // priority_queue is empty
 while (!q.empty())
 {
 cout << q.top() << endl;
 q.pop();
 }  

// Insert items in the priority_queue(uses vector)
 p.push('c');
 p.push('a');
 p.push('d');
 p.push('m');
 p.push('h');  

 // Output the item at the top using top()
 cout << p.top() << endl;  

 // Output the size of priority_queue
 size_q = p.size();
 cout << "size of p is:" << size_q << endl;  

 // Output items in priority_queue using top()
 // and use pop() to get to next item until
 // priority_queue is empty
 while (!p.empty())
 {
 cout << p.top() << endl;
 p.pop();
 }
}

输出结果:  
42   
size of q is:4   
42   49   100   201   
m  
size of p is:5  
m   h   d   c  a 

示例2
#include<iostream>
#include<queue>
using namespace std;
struct cmp
{
 bool operator()(const int &a,const int &b)  

 {
 return a<b;//按升序排序  

 }
};
typedef priority_queue< int, vector<int>, cmp > qu;
void main()
{
 qu p;
 p.push(42);
 p.push(100);
 p.push(49);
 p.push(201);
 while (!p.empty())
 {
 cout << p.top() << endl;
 p.pop();
 }
} 


输出结果:   
201   100   49   42 

示例3(用priority_queue实现哈夫曼树):
#include<iostream>
#include<queue>
using namespace std;
class Node
{
public:
 int weight;
 Node* left;
 Node* right;
 Node(int w, Node* l, Node* r): weight(w), left(l), right(r) {}
 Node(int w): weight(w), left(NULL), right(NULL) {}
};  

class cmp //用于priority_queue的仿函数类
{
 public :
 bool operator()(Node* a,Node* b)  

 {
 return a->weight>=b->weight;
 }
};  

//传入的是指针,如果用对象去实现,你就不知道左右指针的指向了  

//中序遍历
void InOrder(Node* p)
{
 if (p != NULL)
 {
 InOrder(p->left);
 cout<<p->weight<<'/t';
 InOrder(p->right);
 }
}  

void freeTree(Node* p)//销毁二叉树
{
if(p->left!=NULL)
 freeTree(p->left);
if(p->right!=NULL)
 freeTree(p->right);
delete(p);
}  

int main()
{
 Node* m1,*m2;
 priority_queue<Node*,vector<Node*>,cmp> q;
 for(int i=0;i<6;++i)//6个节点
 {
 int n=rand()%100;
 q.push(new Node(n));//权值随机产生
 cout<<n<<'/t';
 }
 cout<<endl;
 for(int j=1;j<6;++j)//合并5次
 {
 m1=q.top(); q.pop();
 m2=q.top(); q.pop();
 int w=m1->weight+m2->weight;
 q.push(new Node(w,m1,m2));
 }
 Node* root=q.top();
 InOrder(root);
 cout<<endl;
 freeTree(root);  

 system("pause");
 return 0;
} 


输出结果:  
41 67 34 0 69 24  
41 99 0 24 24 58 34 235 67 136  

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 02:45:57

C++ 优先队列应用方法 浅析的相关文章

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析 Android中数据存储有5种方式: [1]使用SharedPreferences存储数据 [2]文件存储数据 [3]SQLite数据库存储数据 [4]使用ContentProvider存储数据 [5]网络存储数据 在这里我只总结了三种我用到过的或即将可能用到的三种存储方法. 一.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基

结构化方法与面向对象方法浅析

结构化方法与面向对象方法浅析   在目前的软件开发领域,结构化方法和面向对象方法是两种比较流行的方法.在过去两年多时间里,我们也对这两种方法进行了学习和实践,下面谈一谈自己对这两种方法的理解.   结构化方法   结构化方法是一种比较传统的软件系统开发方法,主要思想是分析问题确定软件功能,之后将整体功能划分成不同的功能模块,然后将实现之后的模块拼接结合在一起,是一个先分再和的过程.功能分解可以使软件条理清晰,将复杂的问题拆分成相对简单的小问题也便于实现. 结构化方法注重算法和数据,程序过程可以看

loadrunner关联及web_reg_save_param方法浅析

loadrunner关联及web_reg_save_param方法浅析 一.什么是关联 关联(correlation):脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联.也是把脚本中某些写死的数据,转变成动态的数据. 什么内容需要关联:当脚本中的数据每次回放都发生变化时,并且这个动态数据在后面的请求中需要发送给服务器,那

java程序入口main()方法浅析

java程序入口main()方法浅析 main()方法的方法签名 public static void main(String[] args) 方法签名讲解 ?public修饰符:java类由java虚拟机(JVM)调用,为了没有限制可以自由的调用,所以采用public修饰符. ?static修饰符:JVM调用这个主方法时肯定不是先创建这个主类的对象,再通过对象来调用方法,而是直接通过该类来调用这个方法,因此需要使用static修饰符修饰这个类. ?void返回值:主方法被JVM调用,将返回值返

PCA(主成分分析)方法浅析

PCA(主成分分析)方法浅析 降维.数据压缩 找到数据中最重要的方向:方差最大的方向,也就是样本间差距最显著的方向 在与第一个正交的超平面上找最合适的第二个方向 PCA算法流程 上图第一步描述不正确,应该是去中心化,而不是中心化 具体来说,投影这一环节就是:将与特征值对应的k个特征向量分别作为行向量组成特征向量矩阵P 直接乘以特征变量就好.原来是二维数据,降维之后只有一维. 我们想保留几个维度的特征,就留下几个特征值和对应的特征向量. 原文地址:https://www.cnblogs.com/j

Python 之 h5py 读取 matlab 中 .mat 文件 cell 方法浅析

采用 Python 读取 matlab 中 .mat文件的方法有很多,中外文的论坛上都不少,相关博文 可见:Python 从 mat 文件的读写和存储 到 h5py 文件包. 详址:http://blog.csdn.net/u013630349/article/details/47090299 但是,在读取matlab文件的时候,往往不是一层 .mat 就足以解决问题的,.mat 文件中可能是存放的 cell(100*200) 数据, cell(100*200)数据中又分为多个 cell .那么

HBase可靠性管理方法浅析

HBase是一个可以进行实时读和写操作的分布式NoSQL系统,建立在HDFS之上,是Hadoop生态圈中重要的一部分.在HBase中底层存储结构采用的LSM-tree的方式进行处理,为了保证HBase的数据可靠性和可用性,HBase采用了多种方式,包括Snapshot.Replication等多种方式,下面简单分析HBase中的这几种方法.  1.Snapshot(快照) 快照是一些重要的元数据信息,这样系统管理员可以根据这些元数据信息有效的恢复到以前的状态.在系统运行过程中,有时需要恢复到以前

@classmethod及@staticmethod方法浅析【python】

目前对于python中@classmethod 类方法和@staticmethod静态方法的有了一定的认识,之后有进一步的认识后继续记录. @classmethod :是和一个class类相关的方法,可以通过类货类实例进行调用,并将该class对象(不是class的实例对象)隐式地当作第一个参数传入. @staticmethod :基本上和一个全局函数差不多,可以通过类或者类的实例对象进行调用,不会隐式地传入任何参数. 区别 :类方法需要额外的类变量cls,调用类方法传入的类变量cls是子类,而

ES6数组实用方法浅析

1.map() [1,2,3,4].map(function(item, index, array){ return  item * 2; }) 对数组中的每一项执行一次回调函数,三个参数依次为:数组中的每一项.每一项的下标.原数组. map方法会改变原数组. 2.filter() [1,22,3,14].filter(function(item, index, array){ return  item >= 10; }) 对数组中的每一项执行一次回调函数,三个参数依次为:数组中的每一项.每一项