优先队列(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++中的默认operator=操作的详解

    当我们在C++中定义一个类时,如果没有显式地定义“赋值运算符”(operator=),C++编译器会默认为该类生成一个“赋值运算符”(operator=)。然而,这个默认生成的“赋值运算符”(operator=)并不总是正确的,它会导致我们在使用类时出现问题。因此,本文将详细讲解“解析C++中的默认operator=操作的详解”的完整攻略,帮助大家更好的理解…

    C 2023年5月23日
    00
  • 一篇文章了解c++中的new和delete

    一篇文章了解C++中的new和delete 什么是new和delete 在C++中,当我们需要动态地分配内存,即在程序运行时才能确定需要分配的内存大小时,我们可以使用new和delete关键字来完成内存的申请和释放操作。 new关键字用于在堆上分配内存,而delete关键字则用于释放该内存。 new的使用方法 new的语法格式为: 指针变量 = new 数据…

    C 2023年5月23日
    00
  • C语言实现计算器的两种方法

    当下常见编程语言中,C语言是一种十分常用的语言。C语言可以用来开发各种类型的应用、系统和游戏,其中之一就是实现计算器。下面将结合两条示例来详细讲解“C语言实现计算器的两种方法”的完整攻略。 第一种方法:基于表达式求值的计算机实现 思路分析 在程序开发者社区中,基于表达式求值的方式是最广泛使用的方法之一。下面是一个实现“基于表达式求值的计算机”的思路: 读入表…

    C 2023年5月23日
    00
  • vue中如何实现复制内容到剪切板详解

    让我们来详细讲解一下“vue中如何实现复制内容到剪贴板”的完整攻略。 第一步:安装依赖 在使用vue实现复制内容到剪贴板之前,需要安装一个剪贴板操作插件clipboard(也可以使用其他类似插件)。 使用npm在项目中安装clipboard插件: npm i clipboard –save 第二步:创建一个指令 在Vue中实现复制内容到剪贴板需要创建一个指…

    C 2023年5月23日
    00
  • C语言实现教务管理系统

    C语言实现教务管理系统攻略 什么是教务管理系统? 教务管理系统是用于学校管理各类学生信息、教师信息、考试信息、课程信息等的一款软件。它能够提供方便快捷的教务事务处理,节约时间和劳动力,提高工作效率和精度。 C语言实现教务管理系统的必要性 C是一种高效的、跨平台的编程语言,它在系统开发、游戏开发等领域广泛应用。而在实现教务管理系统这样的软件开发中,C语言具有更…

    C 2023年5月23日
    00
  • C语言之system函数案例详解

    C语言之system函数案例详解 简介 system函数是C语言标准库中较为常见的一个函数,它能够执行系统命令,并返回运行结果。 system函数的原型为:int system(const char *command)。它接收一个字符串参数,该字符串为要运行的系统命令。 当调用system函数时,会打开一个新的shell进程,并在该进程中执行指定的系统命令。…

    C 2023年5月23日
    00
  • Go错误和异常CGO fallthrough处理教程详解

    Go错误和异常CGO fallthrough处理教程详解 异常和错误的区别 在Go语言中,没有类似于Java的异常处理机制,而是采用了错误处理机制。Go语言中的错误是一种可以提前预判到的普通值,包含了自定义的错误信息。与其他语言不同,Go语言中的错误处理是基于返回值的,而不是异常。 如何处理错误 在Go语言中,一个函数的返回值通常由一个值和一个错误组成。当函…

    C 2023年5月23日
    00
  • C语言中的时间函数clock()和time()你都了解吗

    当我们需要对程序运行时间进行控制和统计时,就需要使用C语言中的时间函数。其中,clock() 和 time() 函数都可以获取程序执行的时间信息,但它们的用途略有不同。 clock() clock() 函数返回的是程序的 CPU 时间,即程序执行消耗的总时间。 使用方法为:在程序执行前调用 clock() 函数,记录程序的开始时间,程序执行完毕后再次调用 c…

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