优先权队列的实现

数据结构中的优先权队列

 

#include<iostream.h>


enum ResultCode{NOMemory,OutOfBounds,Underflow,Overflow,Duplicate};
template<class T>
class PrioQueue
{
	public:
		PrioQueue(int mSize=20);
		~PrioQueue(){delete[] q;}
		bool IsEmpty() const{return n==0;}
		bool IsFull() const{return n==maxSize;}
		void Append(const T &x);
		void Serve(T &x);
		void Output();
	private:
		void AdjustDown(int r,int j);
		void AdjustUp(int j);
		T *q;
		int n,maxSize;
};

template<class T>
PrioQueue<T>::PrioQueue(int mSize)
{
	maxSize=mSize;
	n=0;
	q=new T[maxSize];
}


template<class T>
void PrioQueue<T>::Append(const T &x)
{
	if(IsFull()) throw Overflow;
	q[n++]=x;
	AdjustUp(n-1);
}

template<class T>
void PrioQueue<T>::Serve(T &x)
{
	if(IsEmpty()) throw Underflow;
	x=q[0];
	q[0]=q[--n];
	AdjustDown(0,n-1);
}


template<class T>
void PrioQueue<T>::AdjustDown(int i,int j)
{
	int child=2*i+1;
	T temp=q[i];
	
	while(child<=j)
	{
		if((child<j)&&(q[child]>q[child+1]))
			child++;
		if(temp<=q[child])
			break;
		q[(child-1)/2]=q[child];
		child=2*child+1;
	}
	q[(child-1)/2]=temp;
}

template<class T>
void PrioQueue<T>::AdjustUp(int j)
{
	int i=j;
	T temp=q[i];
	while(i>0&&temp<q[(i-1)/2])
	{
		q[i]=q[(i-1)/2];
		i=(i-1)/2;
	}

	q[i]=temp;
}

template<class T>
void PrioQueue<T>::Output()
{
	for(int i=0;i<n;i++)
	{
		cout<<q[i]<<" ";
	}
}


 

测试代码

#include "prioQueue.h"
void main()
{

	try{
		PrioQueue<int> pq;
		int x[5];
		for(int i=0;i<5;i++)
		{
			cin>>x[i];
			pq.Append(x[i]);
		}
		
		pq.Output();
		pq.Serve(x[0]);
		pq.Output();	

	}
	catch(ResultCode err)
	{
		switch(err)
		{
		case Overflow:cout<<"Overflow"<<endl;
		case Underflow:cout<<"Underflow"<<endl;
		}
	}
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优先队列(Priority Queue)是一种特殊的队列,其中每个元素都有一个与之关联的优先级。优先级高的元素在队列中具有更高的优先级,因此会被优先处理。 优先队列的常见应用是任务调度、事件处理等场景,其中需要根据优先级来确定下一个要处理的任务或事件。 优先队列可以使用多种数据结构来实现,其中最常见的是堆(Heap)。堆是一种完全二叉树,具有以下两个特点: 1. 父节点的值总是大于等于(最大堆)或小于等于(最小堆)它的子节点的值。 2. 堆总是一棵完全二叉树,即除了最后一层外,其他层都是满的,最后一层从左到右排列。 优先队列算法的基本原理是: 1. 根据元素的优先级构建一个堆。 2. 每当需要插入一个元素时,将其插入到堆中的适当位置,并保持堆的结构不变。 3. 每当需要弹出最高优先级的元素时,从堆的根节点中取出该元素,并重新调整堆,使得堆保持其性质。 具体实现中,可以使用堆来存储优先队列中的元素,而堆的根节点就是具有最高优先级的元素。根据堆是最小堆还是最大堆,可以实现不同的优先队列,即最小优先队列和最大优先队列。 在最小优先队列中,具有最小优先级的元素将首先被处理。而在最大优先队列中,具有最大优先级的元素将首先被处理。 常见的优先队列操作包括: - 插入元素:将元素插入到队列中的适当位置,以保持堆的性质。 - 删除最高优先级元素:从堆中取出具有最高优先级的元素,并重新调整堆。 - 修改元素优先级:修改队列中某个元素的优先级,并重新调整堆。 总结起来,优先队列算法通过使用堆来实现,能够高效地处理具有优先级的任务或事件。它在许多实际应用中都发挥着重要的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值