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

yizhihongxing

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

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程序 计算矩阵对角线之和”的使用攻略。 程序功能说明 本程序通过输入矩阵的行列数以及矩阵元素,计算出矩阵的对角线之和。矩阵可以是正方形矩阵或长方形矩阵,支持浮点数和整数类型的元素。 程序使用说明 环境准备 在运行本程序前,需要确保您的电脑上已经安装了GCC编译器、C语言库以及相关的开发工具。 程序下载 您可以在网上搜索“矩阵对角线之和C程序下载”,…

    C 2023年5月9日
    00
  • Go与C语言的互操作实现

    Go与C语言的互操作实现 Go是一门高效、安全、并发的编程语言,但是它的标准库并不像其他语言那么丰富。许多功能需要引入外部库才能实现。而C语言则是一门底层语言,有很多底层的库和功能。所以在一些特定场景下,我们需要使用Go与C语言相互协作来实现这些功能。本文将会详细讲解如何在Go程序中集成C代码。 Go的C语言接口 Go与C语言之间的交互主要是通过C语言接口实…

    C 2023年5月23日
    00
  • C++使用智能指针实现模板形式的单例类

    下面我将详细讲解使用智能指针实现模板形式的单例类的完整攻略。 1. 什么是智能指针? 智能指针是一个 C++ 类,它的实例行为类似于指针,不过它添加了自动内存回收的管理功能。智能指针中最常用的是 std::shared_ptr 和 std::unique_ptr。 我们使用智能指针可以避免内存泄漏和空悬指针,避免程序崩溃等问题。 2. 什么是模板形式的单例类…

    C 2023年5月23日
    00
  • Node.js 源码阅读深入理解cjs模块系统

    Node.js 源码阅读深入理解cjs模块系统的攻略可以分为以下几步: 1. 下载 Node.js 源代码 首先需要从 Node.js 官方网站下载 Node.js 的源代码。可以去 Node.js官网 下载最新版本的源代码,或者从 GitHub上的 Node.js仓库 上下载。下载后解压至本地,然后使用命令行工具进入解压后的目录。 2. 阅读 cjs 模块…

    C 2023年5月23日
    00
  • C++的静态类型检查详解

    C++的静态类型检查详解 C++是一门静态类型的编程语言,其中的静态类型检查是C++编译器能够在编译期间确定程序中变量类型的能力。这种特性提供了许多优点,例如类型安全和代码可读性,同时也有一些限制。 静态类型检查是什么 静态类型检查是指编译器在编译程序时,通过对程序的语法分析和类型推导,能够确定每个变量的类型和类型之间的关系。根据类型检查结果,编译器可以在编…

    C 2023年5月22日
    00
  • JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)

    JavaScript中的对象和数组复制可以使用浅拷贝和深拷贝的概念。在进行对象和数组复制时,使用的是复制原始值,而不是将原始值的引用作为新值传递。 浅拷贝 浅拷贝会创建一个新的对象或数组,然后将原始对象或数组的所有属性或元素复制到新的对象或数组中。新对象或数组中的属性或元素仍然指向原始对象或数组中的相同值。 创建浅拷贝有多种方法,其中最常见的方法是使用展开运…

    C 2023年5月23日
    00
  • Win10安装打印机驱动出现错误代码0xc000007b的原因及解决方法

    Win10安装打印机驱动出现错误代码0xc000007b的原因及解决方法攻略 引言 在进行Windows 10系统安装打印机驱动程序时,常会出现错误代码0xc000007b的问题,该问题会影响到您正常的打印操作,需要得到有效的解决。 原因分析 错误代码0xc000007b的出现通常是由于打印机驱动程序文件缺少或不完整,无法正确运行。而导致打印机驱动程序缺少或…

    C 2023年5月23日
    00
  • C语言实现简单推箱子游戏

    C语言实现简单推箱子游戏攻略 游戏概述 推箱子游戏是一款非常经典的智力益智游戏,玩家需要控制箱子的移动,将箱子全部移动到指定位置即可获胜。在本文中,我们将使用C语言来实现一个简单的推箱子游戏。 游戏规则 游戏地图上有若干个箱子和若干个目标点。 箱子只能水平或垂直移动,不能斜着移动。 箱子不能移动到墙上,也不能推到其他的箱子或目标点上。 箱子被推到目标点上后,…

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