队列的应用:优先级队列

优先级队列:如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。

优先级队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素(3)删除
一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。

以上是网上常见的对优先级队列的描述。偷个懒,直接抄过来。主要是它描述的很清楚。

重要的是优先级队列与普通队列的区别:

  1. 删除时,总是删除优先级最大的,并非只是普通的队头出队。
  2. 普通队列不存在查找操作。优先级队列的查找,一定是查找优先级最大的。

下面我们使用顺序存储结构实现优先级队列,其它的细节看代码:

类定义和类实现

#include<iostream>
#include<iomanip>
using namespace std;
const int MAX = 10;
typedef struct node    //priority queue node
{
	int no;        //任务编号
	int priority;   //优先级
}PQNode;
class PQueue    //优先级队列类
{
private:
	PQNode *base;
	int size;     //队列大小
public:
	//构造函数
	PQueue();
	//析构函数
	~PQueue();
	//获取队列大小
	int getSize()
	{return size;}
	//判断队列是否为空
	bool empty()
	{return size == 0;}
	//清空
	void clear()
	{size = 0;}
	//重载运算符<
	bool friend operator<(PQNode node1, PQNode node2);
	//入队
	bool push(PQNode);
	//出队
	bool pop(PQNode&);
	//查找
	bool find(PQNode&);
	//遍历
	void queueTraverse();
};
PQueue::PQueue()
{
	base = new PQNode[MAX];
	size = 0;
}
PQueue::~PQueue()
{
	delete[]base;
}
bool operator<(PQNode node1, PQNode node2)
{
	return node1.priority < node2.priority;
}
bool PQueue::push(PQNode node)
{
	int i;
	for (i=0; i < size; i++)
	{
		if (node.no == base[i].no)  //对于已存在的任务编号更新优先级
		{
			base[i].priority = node.priority;
			break;
		}
	}
	if (i < size || (i == size && size < MAX))
	{
		if (i == size)
		base[size++] = node;
		return true;
	}
	//已无空间存放新节点
	return false;
}
bool PQueue::pop(PQNode &node)
{
	if (size == 0)
		return false;
	int index = 0;
	for (int i = 1; i < size; i++)
	{
		if (base[i] < base[index])  //若是没有重载<,则这里必须写成base[i].priority<base[index].priority
			index = i;
	}
	node = base[index];
	/*
	出队后,index位置该如何填补?
	方法多种:
	一、index后的元素依次前移
	二、直接用最后一个元素填到index位置
	建议使用第一种
	*/
	size--;
	for (int i = index; i < size; i++)
		base[i] = base[i + 1];
	return true;
}
bool PQueue::find(PQNode &node)
{
	if (size == 0)
		return false;
	int index = 0;
	for (int i = 1; i < size; i++)
	{
		if (base[i] < base[index])
			index = i;
	}
	node = base[index];
	return true;
}
void PQueue::queueTraverse()
{
	if(!empty())
	{
		int i=0;
		cout<<"编号"<<" "<<"优先级"<<endl;
		while (i < size)
		{
			cout<<setw(4)<<base[i].no<<setw(4)<<base[i].priority<<endl;
			i++;
		}
	}
}

主函数

int main()
{
	cout<<"******优先级队列演练******"<<endl;
	PQueue pqueue;
	cout<<"队列目前的状态是";
	pqueue.empty()?cout<<"空!"<<endl:cout<<"非空!"<<endl;
	PQNode node;
	cout<<"输入任务号和优先级(一组一行),输入0 0结束"<<endl;
	while(cin>>node.no>>node.priority && node.no && node.priority)
		pqueue.push(node);
	cout<<"打印队列"<<endl;
	pqueue.queueTraverse();
	cout.setf(ios::left);
	cout<<"查找优先级最高的"<<endl;
	pqueue.find(node)?cout<<"编号是"<<setw(4)<<node.no<<"优先级是"<<setw(4)<<node.priority<<endl:cout<<"空队列,无法查找!"<<endl;
	cout<<"队列清空"<<endl;
	pqueue.clear();
	cout<<"队列目前的状态是";
	pqueue.empty()?cout<<"空!"<<endl:cout<<"非空!"<<endl;
	system("pause");
	return 0;
}

运行:

完整代码下载:优先级队列

专栏目录看这里:数据结构与算法目录

队列的应用:优先级队列,布布扣,bubuko.com

时间: 2024-08-06 18:43:39

队列的应用:优先级队列的相关文章

STL学习系列七:优先级队列priority_queue容器

1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一

优先级队列(Priority Queue)

优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素.但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列. 1. 优先级队列的概念 1.1 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. 1.2 优先级队列的特点 优先级队列是0个或多个元素的集合,每个元素都有一个优先权或值

Java优先级队列PriotyQueue

优先级队列,顾名思义,和传统"先进后出"的队列相比,优先级队列在元素加入时就根据该元素的优先级插入到相应位置.实际上优先级队列PriotyQueue在poll时还是遵循先进后出,只是数据在进入时已经根据优先级排序了.实现优先级队列需要实现一个Comparator,测试代码如下: public class PriotyQueueTest { //比较器,用于判断两个元素的优先级 Comparator<Man> t = new Comparator<Man>() {

数据结构Java实现——队列的“奇葩”二 优先级队列

写在前面 有很多时候,一些数据的存储不仅需要先进先出,而且还有根据数据的优先级来排序,也就是优先级高的一定先出去,优先级相同的先进先出,此时就会用到优先级队列 应用 其实优先级队列的应用十分广泛,比如说构造哈夫曼树算法,再比如在一些计算机操作系统中用优先级队列来来满足抢先式多任务操作系统等等等等 代码实现 1.优先级队列存储的数据元素的描述 package org.Stone6762.entity; /** * @ClassName_PriorityQData优先级队列的结点中的数据部分的描述

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

Rabbitmq中的优先级队列操作

1.%% 普通队列操作 in(X, 0, {queue, [_] = In, [], 1}) ->{queue, [X], In, 2}; in(X, 0, {queue, In, Out, Len}) when is_list(In), is_list(Out) -> {queue, [X|In], Out, Len + 1}; 优先级队列操作: in(X, Priority, Q = {queue, [], [], 0}) -> in(X, Priority, {pqueue, []

初学算法-基于最小堆的优先级队列C++实现

笔者近日实现了最小堆类及其派生的优先级队列,特将代码奉上,不足之处还请指出! 在实现优先级队列时,笔者表示萌萌哒没有用过template写派生类,结果写完了出现error: *** was not decleared in this scope..后来各种补上this->才完事,在CSDN(笔者的帖子地址? http://bbs.csdn.net/topics/391806995)上提问后才知道是模板参数依赖,笔者表示涨姿势了.. /**  * The Minimum Heap Class an

【转】java中PriorityQueue优先级队列使用方法

优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个demo~ 如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口.下面的方法,实现了根据某个变

优先级队列及小顶堆排序

优先级队列及小顶堆排序实现 /** @file          HeapSort.h *  @copyright     personal *  @brief         优先级队列及堆排序 *  @version       V1.0.0 *  @author        fangyuan *  @date          2015/12/31 *  @note          测试版本 */ #include "iostream" using namespace std

初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现

这一次,笔者使用了STL库中的优先级队列(Priority Queue)来完成Dijkstra算法中extract-min()语句(即从未选中的节点中选取一个距离原点s最小的点)的功能.由于优先级队列的插入.删除操作只需要logn的时间花费,因此降低了不少运行时间. 本文使用C++实现了这一基本算法.参考<算法导论>第24.3节. /**  * Dijkstra's Single Source Shortest Path Algorithm in C++  * Time Cost : O(Ml