C++实现一个优先级队列
优先级队列由一组元素组成 定义为:PriorityQueue
每个元素由数据和优先级组成 定义为:Node
本个示例元素存储的数据为string
可以在第三行的typedef处修改成任意类型
#include <iostream>
using namespace std;
typedef string elem;
//优先级队列由一组元素组成 定义为:PriorityQueue
//每个元素由数据和优先级组成 定义为:Node
struct Node
{
int Priority;
//priority 值越小优先级越高
elem element;
};
void init_N(Node *N,elem e,int p){
N->element=e;
N->Priority=p;
}
struct PriorityQueue
{
int count;//元素个数
Node *data;
int size;
};
void init_PQueue(PriorityQueue *Q,int size){
Q->size=size;
Q->data=new Node [Q->size];
Q->count=0;
}
bool insert(PriorityQueue *Q,Node N){
//插入到队尾
if(Q->count>=Q->size){
return false;
}
Q->data[Q->count]=N;
Q->count++;
return true;
}
Node FindByPri(PriorityQueue *Q){
//找到优先级最大的元素
Node min_N=Q->data[0];
int min=Q->data[0].Priority;
for (int i = 0; i < Q->count; i++)
{
if(Q->data[i].Priority<min){
min_N=Q->data[i];
min=Q->data[i].Priority;
}
}
return min_N;
}
int FindByPri_ID(PriorityQueue *Q){
//找到优先级最大的元素的Id
Node min_N=Q->data[0];
int min=Q->data[0].Priority;
int id=0;
for (int i = 0; i < Q->count; i++)
{
if(Q->data[i].Priority<min){
min_N=Q->data[i];
min=Q->data[i].Priority;
id=i;
}
}
return id;
}
bool del(PriorityQueue *Q){
//priority 值越小优先级越高
//删除队列Q中优先级最高的元素
if(Q->count==0){
return false;
}
int id=FindByPri_ID(Q);
Q->data[id]=Q->data[Q->count-1];
Q->count--;
return true;
}
void PrintById(PriorityQueue *Q){
for (int i = 0; i < Q->count; i++)
{
cout<<Q->data[i].element<<" ";
/* code */
}
cout<<endl;
}
int main(){
//test init_PQueue,PrintById
PriorityQueue Q;
init_PQueue(&Q,20);
Node N;
init_N(&N,"apple",5);
Node N2;
init_N(&N2,"banana",2);
Node N3;
init_N(&N3,"pen",3);
Node N4;
init_N(&N4,"peach",4);
insert(&Q,N);
insert(&Q,N2);
insert(&Q,N3);
insert(&Q,N4);
PrintById(&Q);
//test FindByPri
Node res;
init_N(&res,"",1);
res = FindByPri(&Q);
cout<<res.element<<endl;
//test FindByPri_ID
int id;
id=FindByPri_ID(&Q);
cout<<"id:"<<id<<endl;
//test del
del(&Q);
PrintById(&Q);
}