【数据结构作业】C++实现一个优先级队列(自行定义结构体)

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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值