优先队列(priority_queue)的C语言实现代码

优先队列是一种特殊的队列,每个元素都有一个权值。优先队列不同于一般的队列,它不是先进先出,而是按照元素的权值排序,权值最高的元素最先出队列。

C语言中,我们可以使用结构体和数组来实现优先队列。以下是实现优先队列的C语言代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct priority_queue Priority_Queue;

struct priority_queue{
    int *queue;    // 存储优先队列的数组
    int size;      // 优先队列当前的大小
    int capacity;  // 优先队列的最大容量
};

Priority_Queue* create(int capacity){
    Priority_Queue *q = (Priority_Queue*)malloc(sizeof(Priority_Queue));
    q->queue = (int*)malloc(sizeof(int)*capacity);
    q->size = 0;
    q->capacity = capacity;
    return q;
}

int is_empty(Priority_Queue *q){
    return q->size == 0;
}

int is_full(Priority_Queue *q){
    return q->size == q->capacity;
}

void enqueue(Priority_Queue *q, int data){
    if(is_full(q)){
        printf("Queue overflow\n");
        return;
    }
    int i = q->size - 1;
    while(i>=0 && q->queue[i]<data){
        q->queue[i+1] = q->queue[i];
        i--;
    }
    q->queue[i+1]=data;
    q->size++;
}

int dequeue(Priority_Queue *q){
    if(is_empty(q)){
        printf("Queue underflow\n");
        return -1;
    }
    int data = q->queue[q->size-1];
    q->size--;
    return data;
}

void display(Priority_Queue *q){
    if(is_empty(q)){
        printf("The queue is empty\n");
        return;
    }
    printf("Priority queue:\n");
    for(int i=q->size-1;i>=0;i--){
        printf("%d\n", q->queue[i]);
    }
}

int main(){
    Priority_Queue *q = create(5);
    enqueue(q, 10);
    enqueue(q, 20);
    enqueue(q, 30);
    enqueue(q, 40);
    display(q);
    printf("The highest priority element dequeued: %d\n", dequeue(q));
    printf("The highest priority element dequeued: %d\n", dequeue(q));
    display(q);
    return 0;
}

以上代码中,我们定义了一个带有三个字段的结构体Priority_Queue,分别用来存储优先队列的数组,当前的大小,以及最大容量。我们用到了动态内存分配来创建队列,并定义了一些基本的操作,如创建队列,判断队列是否为空、满、入队和出队操作。具体实现如下:

  • create(int capacity):创建一个容量为capacity的优先队列。
  • is_empty(Priority_Queue *q):判断队列q是否为空,如果队列为空返回1,否则返回0。
  • is_full(Priority_Queue *q):判断队列q是否已满,如果队列已满返回1,否则返回0。
  • enqueue(Priority_Queue *q, int data):将元素data插入到队列q中。
  • dequeue(Priority_Queue *q):从队列q中删除并返回最高优先级的元素。
  • display(Priority_Queue *q):输出队列q。

以下是两个示例。

示例1:我们创建一个容量为5的优先队列,插入10、20、30、40、50。顺序为50->40->30->20->10,然后依次出队操作,输出结果为50->40、50->30、50->20、50->10、50、队列已为空。

Priority_Queue *q = create(5);
enqueue(q, 10);
enqueue(q, 20);
enqueue(q, 30);
enqueue(q, 40);
enqueue(q, 50);
display(q);
while(!is_empty(q)){
    printf("The highest priority element dequeued: %d\n", dequeue(q));
    display(q);
}

示例2:我们创建一个容量为3的优先队列,插入元素2、1和3,顺序为3->2->1。然后依次出队操作,输出结果为3->2、3->1、队列已为空。

Priority_Queue *q = create(3);
enqueue(q, 2);
enqueue(q, 1);
enqueue(q, 3);
display(q);
while(!is_empty(q)){
    printf("The highest priority element dequeued: %d\n", dequeue(q));
    display(q);
}

这些代码可以帮助理解优先队列在C语言中的实现,也可以作为您自己实现优先队列的参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:优先队列(priority_queue)的C语言实现代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言解数独程序的源码

    让我们来详细讲解一下“C语言解数独程序的源码”的完整攻略。 什么是数独? 在介绍程序之前,我们先来了解一下数独。 数独是一种智力游戏,由9×9的方格组成,分成9个3×3的小方格,在已知数的基础上填上未知的数字,使得每一行、每一列和每一个小方格内的数字均为1~9,且不重复。数独不但能训练大脑的逻辑、思维能力,还能减轻压力、增加乐趣。 源码分析 下面,我们来分析…

    C 2023年5月23日
    00
  • Windows系统出现致命错误C0000034正在更新操作174的解决方法

    Windows系统出现致命错误C0000034正在更新操作174的解决方法 问题描述 在Windows系统更新期间,用户可能会遇到以下错误提示: Windows系统出现致命错误C0000034正在更新操作174 出现这种错误提示时,系统更新进程会在一段时间后终止,并回滚所有进行的更改,导致系统无法更新。 解决方法 以下是解决此问题的步骤: 步骤 1:进入WI…

    C 2023年5月30日
    00
  • C语言 指针数组详解及示例代码

    C语言 指针数组详解及示例代码 本文介绍C语言中的指针数组,包括定义和使用方法,以及示例代码。 什么是指针数组? 指针数组是一个数组,其元素都是指针类型。它可以用来存放一系列指向不同数据类型的指针变量。 如何定义指针数组? 定义指针数组需要使用以下语法: type *array_name[size]; 这里的type代表指针指向的数据类型,array_nam…

    C 2023年5月24日
    00
  • C程序 两个复数相加

    C程序:两个复数相加使用攻略 什么是复数? 复数是由实部和虚部组成的数字,可以表示为 a+b*i,其中 a 为实部,b 为虚部,i 为虚数单位。 目标 本篇攻略旨在帮助大家编写一个C程序,用于计算两个复数的和。程序将要接收四个变量,分别表示两个复数的实部和虚部,计算他们的和并返回结果。 程序流程 程序的大致流程如下: 首先定义两个结构体数据类型 comple…

    C 2023年5月9日
    00
  • C++11智能指针中的 unique_ptr实例详解

    C++11智能指针中的 unique_ptr实例详解 简介 在C++11中,引入了新的智能指针模板类unique_ptr,它能自动管理动态内存,从而避免内存泄漏和野指针等问题。unique_ptr是一个独占式智能指针,它禁止拷贝和赋值,并在生命周期结束时自动释放内存。 本篇文章将详细介绍unique_ptr的使用方法和注意事项,并结合实例进行说明。 uniq…

    C 2023年5月23日
    00
  • C# 格式化JSON的两种实现方式

    下面我会详细讲解“C# 格式化JSON的两种实现方式”的完整攻略。 标准化JSON 在对JSON进行格式化处理之前,我们需要首先将其标准化,这样可以排除语义上的差异,从而方便后续的处理。具体实现方法是:按照字典序对JSON的对对象属性进行排序,这个排序过程会递归遍历对象及其属性。 在C#中,可以使用Newtonsoft.Json库提供的以下类和方法来将JSO…

    C 2023年5月23日
    00
  • 国行iphone6产地及生产日期表一览

    国行 iPhone 6 产地及生产日期表一览 如果你想要知道你的 iPhone 6 是在哪里生产的,以及它的生产日期,本文将为你提供详细攻略。 1. 查看序列号 首先打开你的 iPhone 6,进入“设置”-“通用”-“关于本机”,向下滑动界面找到序列号。 记录下这个序列号,它包含了你的 iPhone 6 的生产信息,其中包括生产厂商、生产日期等。 2. 分…

    C 2023年5月22日
    00
  • OpenCV利用高斯模糊实现简单的磨皮美颜效果

    下面是关于OpenCV利用高斯模糊实现简单的磨皮美颜效果的完整攻略。 1. 磨皮美颜效果简介 磨皮美颜是一种通过图像处理算法,以减少图像中噪点等细节进行图像平滑和减少细节信息等操作,使得图像看起来更加平滑细腻的效果。 OpenCV是一款流行的开源计算机视觉库,支持各种图像处理函数,包括高通、低通、滤波器等。我们可以利用OpenCV的高斯模糊算法来实现简单的磨…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部