首页 > 其他分享 >使用C语言实现队列:基础与实践

使用C语言实现队列:基础与实践

时间:2024-12-12 22:59:47浏览次数:2  
标签:return 队列 实践 value C语言 Queue printf front

队列(Queue)是一种常见的数据结构,遵循“先进先出”(FIFO,First In First Out)的原则。队列在许多计算机科学领域中有着广泛的应用,例如任务调度、缓冲区管理等。本文将以C语言为例,详细介绍如何实现一个简单的队列,包括两种主要实现方式:基于数组和基于链表的实现。


队列的基本操作

一个队列通常包括以下几种基本操作:

  1. 初始化队列(Initialize):创建一个空的队列。
  2. 入队(Enqueue):将一个元素添加到队列的末尾。
  3. 出队(Dequeue):移除并返回队列的头部元素。
  4. 检查队列是否为空(IsEmpty):判断队列是否为空。
  5. 获取队列头部元素(Peek):获取但不移除队列的头部元素。

基于数组实现队列

优点和缺点

基于数组的队列实现简单且直观,但需要预先定义数组的大小,可能导致内存浪费或溢出问题。

实现代码

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

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int front;
    int rear;
} Queue;

// 初始化队列
void initQueue(Queue *q) {
    q->front = 0;
    q->rear = 0;
}

// 检查队列是否为空
bool isEmpty(Queue *q) {
    return q->front == q->rear;
}

// 检查队列是否已满
bool isFull(Queue *q) {
    return (q->rear + 1) % MAX_SIZE == q->front;
}

// 入队
bool enqueue(Queue *q, int value) {
    if (isFull(q)) {
        printf("队列已满,无法入队!\n");
        return false;
    }
    q->data[q->rear] = value;
    q->rear = (q->rear + 1) % MAX_SIZE;
    return true;
}

// 出队
bool dequeue(Queue *q, int *value) {
    if (isEmpty(q)) {
        printf("队列为空,无法出队!\n");
        return false;
    }
    *value = q->data[q->front];
    q->front = (q->front + 1) % MAX_SIZE;
    return true;
}

// 获取队列头部元素
bool peek(Queue *q, int *value) {
    if (isEmpty(q)) {
        printf("队列为空,无法获取头部元素!\n");
        return false;
    }
    *value = q->data[q->front];
    return true;
}

// 打印队列
void printQueue(Queue *q) {
    if (isEmpty(q)) {
        printf("队列为空!\n");
        return;
    }
    printf("队列元素:");
    int i = q->front;
    while (i != q->rear) {
        printf("%d ", q->data[i]);
        i = (i + 1) % MAX_SIZE;
    }
    printf("\n");
}

int main() {
    Queue q;
    initQueue(&q);

    enqueue(&q, 10);
    enqueue(&q, 20);
    enqueue(&q, 30);

    printQueue(&q);

    int value;
    dequeue(&q, &value);
    printf("出队元素:%d\n", value);

    printQueue(&q);

    return 0;
}

基于链表实现队列

优点和缺点

基于链表的队列不需要预定义大小,内存使用更加灵活,适用于元素数量动态变化的场景。但实现相对复杂,需要额外的内存管理。

实现代码

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

typedef struct Node {
    int data;
    struct Node *next;
} Node;

typedef struct {
    Node *front;
    Node *rear;
} Queue;

// 初始化队列
void initQueue(Queue *q) {
    q->front = NULL;
    q->rear = NULL;
}

// 检查队列是否为空
bool isEmpty(Queue *q) {
    return q->front == NULL;
}

// 入队
void enqueue(Queue *q, int value) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    if (!newNode) {
        printf("内存分配失败!\n");
        return;
    }
    newNode->data = value;
    newNode->next = NULL;
    if (isEmpty(q)) {
        q->front = newNode;
        q->rear = newNode;
    } else {
        q->rear->next = newNode;
        q->rear = newNode;
    }
}

// 出队
bool dequeue(Queue *q, int *value) {
    if (isEmpty(q)) {
        printf("队列为空,无法出队!\n");
        return false;
    }
    Node *temp = q->front;
    *value = temp->data;
    q->front = q->front->next;
    if (q->front == NULL) {
        q->rear = NULL;
    }
    free(temp);
    return true;
}

// 获取队列头部元素
bool peek(Queue *q, int *value) {
    if (isEmpty(q)) {
        printf("队列为空,无法获取头部元素!\n");
        return false;
    }
    *value = q->front->data;
    return true;
}

// 打印队列
void printQueue(Queue *q) {
    if (isEmpty(q)) {
        printf("队列为空!\n");
        return;
    }
    printf("队列元素:");
    Node *current = q->front;
    while (current) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    Queue q;
    initQueue(&q);

    enqueue(&q, 10);
    enqueue(&q, 20);
    enqueue(&q, 30);

    printQueue(&q);

    int value;
    dequeue(&q, &value);
    printf("出队元素:%d\n", value);

    printQueue(&q);

    return 0;
}

总结

  1. 基于数组的实现适合队列大小固定的场景,逻辑简单,但需要考虑数组的容量问题。
  2. 基于链表的实现灵活性更高,适合队列大小动态变化的场景,但实现复杂度略高。

根据实际应用场景选择合适的队列实现方式,可以让程序更加高效和可靠。希望本文能帮助大家更好地理解和实现队列!

标签:return,队列,实践,value,C语言,Queue,printf,front
From: https://www.cnblogs.com/happy-coding/p/18603612

相关文章

  • C语言C23版的最新特性
    C23是ISOC标准的最新修订版,在C17的基础上进行了一些改进和扩展,以下是C23的一些新特性。一、新的类型1.十进制浮点数类型:引入了_Decimal32、_Decimal64和_Decimal128三种新的十进制浮点数类型,可用于需要精确十进制计算的场景,如金融计算等,能减少二进制浮点数在十进制表......
  • 用C语言实现栈:从基础到实战
    栈(Stack)是一种基础的数据结构,遵循后进先出(LIFO,LastInFirstOut)的原则。它被广泛应用于函数调用、表达式求值、括号匹配等问题中。在这篇技术博客中,我们将详细介绍如何使用C语言实现一个栈,并涵盖基本的操作以及实战应用。什么是栈?栈是一种特殊的线性表,只允许在一端进行插入和......
  • 使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
    目标检测技术作为计算机视觉领域的核心组件,在自动驾驶系统、智能监控、零售分析以及增强现实等应用中发挥着关键作用。本文将详细介绍PaliGemma2模型的微调流程,该模型通过整合SigLIP-So400m视觉编码器与Gemma2系列的高级语言模型,专门针对目标检测任务进行了优化设计。本文适用于......
  • 《网络安全应急管理与技术实践》网络层-无线ARP欺骗与消息监听重现分析实战教程
    文章目录......
  • C语言数组
    目录数组的初始化数组的引用二维数组二维数组的初始化二维数组的引用在C语言中,数组它可以存储一系列相同类型的数据,数组中的每个元素都有一个索引,索引通常从0开始,定义数组会分配内存,数组名表示内存的首地址;数组的初始化Inta[5]={1,2,3,4,5};这个元素是1,2,3,4,5这......
  • 面试必会(嵌入式)-C语言面试高频(内存管理)
    1.(内存)堆和栈的区别⭐堆栈空间分配不同:栈由操作系统自动进行分配和释放,用于存放函数的参数值、局部变量的值等,具有高效性。堆:一般由程序员手动进行分配和释放,效率比栈低很多。data数据区:存放全局变量,静态变量。堆栈缓存方式不同:栈使用一级缓存,存储在处理器核心中,调用完......
  • 转载:【AI系统】TVM 实践案例
    在本文我们探讨一下,如何利用AI编译器在新的硬件上部署一个神经网络,从算法设计到实际运行,有哪些需要考虑的地方?本文将以TVM为例,首先介绍一下TVM的工作流:导入模型。TVM可以从TensorFlow、PyTorch、ONNX等框架导入模型。转换为Relay。Relay是TVM的中间表示形式,已导......
  • C语言(内存管理)
    main函数原型定义:main函数有多种定义格式,main函数也是函数,函数相关的结论对main函数也有效(也可以定义main函数的函数指针)。main函数的完整写法:intmain(intargc,char*argv[]){}intmain(intargc,char**argv){}扩展写法:main(){}等价intmain(){}intmain......
  • 搜索广告召回技术在美团的实践14
     美团搜索广告介绍从美团流量场景角度来看,美团搜索广告分为两大类,一是列表推荐广告;二是搜索广告。推荐广告以展现商家模式为主,通常叫商家流。搜索广告的展现形式比较丰富,有商家模式,即以商家展现为主,会挂上菜品/商品;还有商品模式,即以商品展现为主,以呈现商品大图、商品标题等核......
  • 搜索广告召回技术在美团的实践搜索广告召回技术在美团的实践9
     美团搜索广告介绍从美团流量场景角度来看,美团搜索广告分为两大类,一是列表推荐广告;二是搜索广告。推荐广告以展现商家模式为主,通常叫商家流。搜索广告的展现形式比较丰富,有商家模式,即以商家展现为主,会挂上菜品/商品;还有商品模式,即以商品展现为主,以呈现商品大图、商品标题等核......