栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

基于数组的(最小)优先队列的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于数组的(最小)优先队列的实现

使用数组作为存储方式的最小优先级队列。 Insert()操作直接把元素item加入到优先级队列的队尾,然后进行调整,把插入元素按它的优先权调整到适当位置,使得队列中所有元素都按照其优先权大小,从小到大形成一个有序序列。最好情况是新插入元素优先权最大,一个元素都不用移动;最差情况是新插入元素的优先权最小, 所有元素都要移动,移动次数达到n+1次,其时间复杂度为O(n); RemoveMin()操作在删除队头元素后,为保持队列有序,需要把所有后续n-1个元素前移,时间复杂度为O(n)
#pragma once
#include 
using namespace std;

const int PQsize = 50;

template
class PQueue
{
public:
	PQueue(int sz = PQsize);
	~PQueue() { delete[] elements; }
	bool Insert(const T& x);			//插入函数
	bool RemoveMin(T& x);				//将队头元素删除
	bool getFront(T& x)const;			//获得队头(具有最小优先级)的元素
	void makeEmpty();					//置空
	bool IsEmpty()const {				//判空
		return count == 0 ? true : false;
	}
	bool IsFull()const {				//判满
		return count == MaxSzie ? true : false;
	}
	int getSize()const {				//求队列元素个数
		return count;
	}

private:
	T *elements;			//优先级队列数组
	int count;				//当前元素个数
	int MaxSzie;			//队列最大可容纳个数
	adjust();				//队列调整函数

};






//================================================实现=================================


template
PQueue::PQueue(int sz):MaxSzie(sz),count(0)
{
	//建立一个最大具有maxsize个元素的空优先队列
	elements = new T[MaxSzie];
	if (elements == nullptr) {
		cout << "分配内存失败!";
	}
}

template
bool PQueue::Insert(const T & x)
{
	//若队列不满,则将元素x插入队尾,否则出错处理
	if (IsFull() == true) {
		cout << "队列已满!";
		return false;
	}
	elements[count++] = x;
	adjust();
	return false;
}

template
bool PQueue::RemoveMin(T & x)
{
	//若队列不为空,则返回最大优先权的元素,同时将该元素删除
	if (count == 0) {
		return false;
	}
	x = elements[0];
	for (int i = 1; i < count; ++i) {     //将数组元素整体向前移动
		elements[i - 1] = elements[i];
	}
	count--;
	return true;
}

template
bool PQueue::getFront(T & x) const
{
	//队列为空,返回FALSE,否则返回第一个元素
	if (IsEmpty() == true) {
		return false;
	}
	else {
		x = elements[0];
		return true;
	}
	
}

template
void PQueue::makeEmpty()
{
	count = 0;
}

template
PQueue::adjust()
{
	//将队尾按其优先级大小,调整到适当位置,保持所有优先权从小到大有序
	T temp = elements[count - 1];
	int j;
	for (j = count - 2; j >= 0; --j) {

		if (elements[j] <= temp) {          //找到小于等于队尾元素的第一个元素,跳出循环
			break;
		}
		else {
			elements[j + 1] = elements[j];			//将元素后移
		}
	}
	elements[j + 1] = temp;					//将队尾元素放在第一个小于等于该元素的元素后面
}



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290099.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号