队列的应用:优先队列

优选队列:假设我们给每一个元素都分配一个数字来标记其优先级。最好还是设较小的数字具有较高的优先级,这样我们就能够在一个集合中訪问优先级最高的元素并对其进行查找和删除操作了。

优先队列(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;
}

执行:

完整代码下载:优先队列

专栏文件夹看这里:

时间: 2024-12-30 00:01:59

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

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

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

c++ STL:队列queue、优先队列priority queue 的使用

说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一个元素4.pop() 删除第一个元素5.push() 在末尾加入一个元素6.size() 返回队列中元素的个数

手工 stack栈 queue队列 priority queue 优先队列 模板

栈stack: 1 struct sta 2 { 3 int sz[100001]; 4 int top() 5 { 6 return sz[top]; 7 } 8 void push(int x){ 9 sz[++top]=x; 10 } 11 void pop(){ 12 if(top>0) 13 top--; 14 } 15 void cl() 16 { 17 top=0; 18 } 19 int size(){ 20 return top; 21 } 22 }stack;

【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

  本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型   队列同样是一种特殊的线性表,其插入和删除的操作分别在表的两端进行,队列的特点就是先进先出(First In First Out).我们把向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue)并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列

数据结构--二项队列的思想与实现

二项队列不是一颗堆序的树,而是堆序树的集合,称为森林,森林中每棵树都是有约束的形式,称为二项树,高度为k的第k个二项树Bk由一个根节点和B0, B1, .......B(k-1)构成,高度为k的二项树的结点个数为2^k,因此可以用二项树的结合表示任意大小的优先队列.例如,大小为13的优先队列就可以用B3,B2,B0来表示,2^0+2^2+2^3 = 13.因此二进制的表示为1101. 例如,二项树B0,B1,B2,B3表示如下: 把所有二项树的根节点按规律放在一个根节点组成的数组中,就组成二项队

索引优先队列的工作原理与简易实现

欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 优先队列与索引优先队列 优先队列的原理大家应该比较熟悉,本质上就是利用完全二叉树的结构实现以log2n的时间复杂度删除队列中的最小对象(这里以小堆顶为例).完全二叉树又可以通过数组下标实现索引,当插入一个对象的时候,利用上浮操作更新最小对象.当删除堆顶最小对象时,将末尾的对象放置到堆顶上,然后执行下沉操作. 优先队列有一个缺点,就是不能直接访问已存在于优先队列中的对象,并更新它们

优先队列及其基本操作的堆实现

用代码说话 /* 本代码实现优先队列:分为最大优秀队列和最小优先队列 优先队列用于维护一组元素构成的集合S的数据结构,其中的 每一个元素都有一个相关的值,称为关键字. 一个最大优先队列支持以下操作: insert(S,x)向S中插入元素x; maximum(S)返回S中的最大键值元素; extract-max(S)去掉并且返回S中的最大键值元素; increase-key(S,x,k)将元素x的关键字增加到k,假设k要不小于x的原关键字 一个最小优先队列支持以下操作: insert(S,x)向S

第20章 priority_queue优先队列容器

/* 第20章 priority_queue优先队列容器 20.1 priority_queue技术原理 20.2 priority_queue应用基础 20.3 本章小结 */ // 第20章 priority_queue优先队列容器 // 20.1 priority_queue技术原理 // 20.2 priority_queue应用基础 -----------------------------------------------------------------------------

STL之priority_queue(优先队列)

priority_queue是一个容器适配器,在这个容器里第一个数据元素是最大的.它的使用场景是什么样:如果12306抢票,为什么黄牛能抢这么多票,感觉12306那边的请求队列是一个优先队列,黄牛的请求携带了一个隐含参数,所以他的请求最先执行.当然这是怀疑.不过也是优先级队列的使用场景.还可以进行排序,把数据压入优先队列中,然后出队列就是由大到小排列了 注意:stl的priority_queue容器需要一个boolean operator<(const T& ,const T&)函数

DZY Loves Topological Sorting (BC #35 hdu 5195 topsort+优先队列)

DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 264    Accepted Submission(s): 63 Problem Description A topological sort or topological ordering of a directed gr