利用Vector实现优先级队列

Posted 小羊教你来编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Vector实现优先级队列相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

目录:

一.什么是优先级队列?

优先级队列就是底层运用了堆的方式,在你输入一串数据以后,如果想要把内部的数据进行出栈的操作,内部会按照优先级的大小来输出,并不会按照你所输入的顺序进行输出 (默认是按照大堆的方式进行输出), 也就是默认按照先将最大的数进行输出,

二.原理的介绍

在这里原理的介绍我就只是简单的介绍其实现的原理,如果想看具体的思路步骤
点击此处看以前写过的堆排序的具体步骤

内部其实是就是通过堆先进行排序
然后每次输出一个数,先将堆头的数据和堆尾的数据进行交换,对堆尾进行删除,然后实现优先级出堆的方式.

三.代码实现

代码是通过Vector开辟的容器来进行实现的.

template<class T,class Container=vector<T>>

class PriorityQueue{		//优先级队列
private:
	vector<T> v;			//利用Vector实现

public:
	void shiftUp(int child){	//这里就是实现子节点和父节点的对比,比较大小,从而实现与父节点的交换

		int parent = (child - 1) / 2;	//父节点对应的位置
		//进行调整
		while (child > 0){		//当子节点>0的时候

			if (v[parent] < v[child]){		//和对应的父节点进行比较
				
				swap(v[parent], v[child]);	//满足则进行交换
				child = parent;		
				parent = (child - 1) / 2;		//交换对应的位置
			}
			else
				break;		//不满足条件,则存放在对应的位置,继续下一个数据的插入
		}
	}

	void shiftDown(){	//当降序排序中出现了两个子节点都大于父节点的时候,怎样交换的实现

		int parent = 0;
		int child = 2 * parent + 1;		//找到对应父子节点的位置
			
		while (child < v.size()){

			//从左右孩子中找到最大值
			if (child+1 < v.size() && v[child] < v[child + 1])	//用最大的子节点和父节点进行交换
				++child;
			if (v[parent] < v[child]){		//看是否满足条件呢

				swap(v[parent], v[child]);	//满足则交换
				parent = child;
				child = 2 * parent + 1;		//交换对应节点的位置
			}
			else
				break;	//不满足则跳出循环
		}
	}

	void push(const T& val){		//插入数据的时候
		
		v.push_back(val);			//先从堆的底步进行插入
		shiftUp(v.size() - 1);		//然后进行升序处理,变为大堆(默认优先级队列为大堆)
	}

	void pop(){		//删除元素也是先默认删除最大的元素
		
		swap(v[0], v[v.size() - 1]);	//先将堆首和堆尾元素进行交换
		v.pop_back();			//然后进行尾删处理
		shiftDown(); 			//在将堆顶所在的最小值进行降序处理
	}

	T& top(){
		
		return v[0];
		//return v.front();		//直接取出容器的第一个元素就是优先级最大的元素
	}

	size_t size() const{
		
		return v.size();		//直接调用Vector中的size()接口
	}

	bool empty() const{
		
		return v.empty();		//调用判空接口
	}
};


template <class T>
struct Greater{		//在类中进行声明,为大堆实现

	bool operator()(const T& val1, const T& val2){
		return val1 > val2;
	}
};

template <class T>
struct Less{		//类中进行声明则为小堆

	bool operator()(const T& val1, const T& val2){
		return val1 < val2;
	}
};

运行结果:

依次输入: 55 66 44 77 88 22 33 .
在这里插入图片描述
主要就是理解内部是按照堆的方式进行存储, 理解优先级含义

以上是关于利用Vector实现优先级队列的主要内容,如果未能解决你的问题,请参考以下文章

拓扑排序-利用优先队列

# Java 常用代码片段

# Java 常用代码片段

优先级队列总结

优先级队列Priority_queue

优先级队列的实现 和 层次遍历建树