C++ 优先队列的简单实现

  普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (largest-in,first-out)的行为特征。

STL中使用heap实现优先队列,底层容器使用的是vector。这里我们使用一个简单数组来代替vector。

以下是一个简单的优先队列实现方案:

template <class T>
class priqueue{
public:
	priqueue(int m){//构造函数传入队列的总长度
		maxsize=m;
		x=new T[maxsize+1];//这里为了计数方便,让下标从1开始
						   //此时,如果一个元素下标为i,则它的
		                                   //左子节点在数组中的下标就是2i
		                                   //右子节点在数组中的下标是2i+1
		n=0;
	}
	void Add(T t){//这里构建一个小顶堆
		x[++n]=t;
		int p;
		for(int i=n;i>1 && x[p=i/2]>x[i];i=p){
			swap(p,i);
		}
	}
	T extractMin(){
		T temp=x[1];//取出堆顶权值最大的那个元素
		x[1]=x[n--];//序列长度减1,并将最后一个元素放在堆顶
		int p;
		for(int i=1;(p=2i)<n;i=p){
			if(p+1<n && x[p]>x[p+1])
				p++;
			if(x[p]>=x[i])//移动到位
				break;
			swap(p,i);
		}
		return temp;
	}
private:
	int n;//队列中元素个数
	int maxsize;//整个队列的总长度
	T *x;//队列指针
	void swap(int i,int j){
		T temp=x[i];
		x[i]=x[j];
		x[j]=temp;
	}
}

  以上的优先队列实现中没有写明相应的保障机制和析构函数,只是一个简单实现。有错误之处还望批评指正。

时间: 2024-10-11 08:59:26

C++ 优先队列的简单实现的相关文章

LA 3135 Argus (优先队列的简单应用)

A data stream is a real-time, continuous, ordered sequence of items. Some examples include sensordata, Internet traffic, nancial tickers, on-line auctions, and transaction logs such as Web usage logsand telephone call records. Likewise, queries over

优先队列的简单应用

priority_queue是种一种功能强大的队列,本质是一个堆 1. 头文件是#include<queue>  (实际编译过程中要加上#include <vector>) 2. 关于priority_queue中元素的比较 模板申明带3个参数:priority_queue<Type, Container, Functional> 其中Type 为数据类型,Container为保存数据的容器(STL里面默认用的是vector),Functional 为元素比较方式. 比

Java优先队列的简单实现

最近在学习最小生成树时,用到了优先队列这个结构,琢磨这自己也来写下,搞了半天终于写出来了,于是就记录下 import java.util.ArrayList; class MyHeap<Type extends Comparable<Type>>{ private ArrayList<Type> data; private int MaxSize; private int size; public MyHeap() { this.MaxSize=0; this.size

优先队列问题(此题来源哈尔滨理工大学VJ)

---恢复内容开始--- Description 小z身处在一个迷宫中,小z每分钟可以走到上下左右四个方向的相邻格之一.迷宫中有一些墙和障碍物.同时迷宫中也有一些怪兽,当小z碰到任意一个怪兽时,小z需要将怪兽消灭掉才可以离开此方格.但消灭怪兽会花费一定的时间.现在小z想知道走出迷宫需要花费的最少时间. Input 输入第一行为组数T(T<=10). 对于每组数据第一行为两个整数R和C(1<=R,C<=200).以下R行每行有C个字符,即迷宫地图. 其中"#"代表墙和障

HDU 1242 &amp;&amp; ZOJ 1649( BFS (队列 || 优先队列)).

~~~~ 突然发现一篇搜索的题目都有写.昨天发现道bfs题目,HDU上AC, ZOJ上WA.不得不说HDU上的数据之水.. 今天早起刷题有了思路,并用队列和单调队列都写了一遍,0MS飘过~~ ~~~~ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=649 ~~~~ 首先有坑的地方是friends,对嘛,朋友有很多,ang

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

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

java数据结构与算法之(Queue)队列设计与实现

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53375004 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈设计与实现 java数据结构

POJ 2051 argus(简单题,堆排序or优先队列)

又是一道数据结构题,使用堆来进行权值调整和排序,每次调整都是o(n)的复杂度,非常高效. 第一眼看题觉得可以用优先队列来做,应该也很简单. 事实上多数优先队列都是通过堆来实现的. 写的时候还是出了一些问题: 1.二叉树根节点下标显然不能为0: 2.限界之后若出现扩界要小心: 3.在迭代循环比较的时候,尤其注意到底比较的是谁,别把自己绕晕了. ac代码: #include<iostream> #include<cstdio> #include<cstdlib> #incl

HDU2425:Hiking Trip(简单bfs,优先队列实现)

题目: 传送门 题意很简单就不解释了,水题一道. #include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> typedef __int64 ll; #define inf 0x3f3f3f3f #include <math.h> #include <queue> using namespace std; struct node { i