C语言队列和应用详情

C 语言队列和应用详情

什么是队列

队列是一种数据结构,可以用来存储一组按顺序排列的元素。队列的特点就是先进先出,即First In First Out,缩写为 FIFO。也就是说,最先插入队列的元素会最先被取出,最后插入队列的元素则会最后被取出。常见的生活中队列应用包括的排队取号,排队坐火车,排队打饭等等。

C 语言实现队列

在 C 语言中,我们可以通过数组来实现队列。首先定义队列结构体,包含队列的属性以及队列的值:

#define QUEUE_SIZE 100
typedef struct{
    int data[QUEUE_SIZE];   // 存放队列元素的数组
    int head;    // 队头指针
    int tail;    // 队尾指针
}Queue;

其中,data 数组是存储队列元素的数组,head 是队头指针,tail 是队尾指针。队列的初始化,队尾、队头的添加和删除操作等函数的实现如下:

// 初始化队列
void InitQueue(Queue *Q)
{
    Q->head = 0;
    Q->tail = 0;
}

// 判断队列是否为空
int QueueEmpty(Queue Q)
{
    return Q.head == Q.tail;
}

// 判断队列是否已满
int QueueFull(Queue Q)
{
    return (Q.tail + 1) % QUEUE_SIZE == Q.head;
}

// 从队尾插入元素
int EnQueue(Queue *Q, int x)
{
    if (QueueFull(*Q))    // 队列已满,插入失败
        return 0;
    Q->data[Q->tail] = x;
    Q->tail = (Q->tail + 1) % QUEUE_SIZE;
    return 1;
}

// 从队头删除元素
int DeQueue(Queue *Q, int *x)
{
    if (QueueEmpty(*Q))    // 队列为空,删除失败
        return 0;
    *x = Q->data[Q->head];
    Q->head = (Q->head + 1) % QUEUE_SIZE;
    return 1;
}

队列的应用

单词倒序

我们可以用队列来实现对单词倒序的功能。对于一段文本,我们可以将其按照空格和其他标点符号进行分割,然后将每个单词插入到队列中。最后从队列中取出单词并拼接起来就能得到倒序后的文本。

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

#define WORD_SIZE 50   // 定义单词的最大长度
#define QUEUE_SIZE 100   // 定义队列的大小

typedef struct{
    char data[WORD_SIZE];
    int length;   // 单词的实际长度
}Word;

typedef struct{
    Word data[QUEUE_SIZE];
    int head;
    int tail;
}Queue;

// 初始化队列
void InitQueue(Queue *Q)
{
    Q->head = 0;
    Q->tail = 0;
}

// 判断队列是否为空
int QueueEmpty(Queue Q)
{
    return Q.head == Q.tail;
}

// 判断队列是否已满
int QueueFull(Queue Q)
{
    return (Q.tail + 1) % QUEUE_SIZE == Q.head;
}

// 从队尾插入元素
int EnQueue(Queue *Q, char *x)
{
    if (QueueFull(*Q))    // 队列已满,插入失败
        return 0;
    Word new_word;
    new_word.length = strlen(x);
    strcpy(new_word.data, x);
    Q->data[Q->tail] = new_word;
    Q->tail = (Q->tail + 1) % QUEUE_SIZE;
    return 1;
}

// 从队头删除元素
int DeQueue(Queue *Q, Word *x)
{
    if (QueueEmpty(*Q))    // 队列为空,删除失败
        return 0;
    *x = Q->data[Q->head];
    Q->head = (Q->head + 1) % QUEUE_SIZE;
    return 1;
}

int main()
{
    char str[] = "hello, how are you today?";
    char *tok = strtok(str, " ,?!");
    Queue Q;
    InitQueue(&Q);
    while (tok != NULL)
    {
        EnQueue(&Q, tok);
        tok = strtok(NULL, " ,?!");
    }
    while (!QueueEmpty(Q))
    {
        Word w;
        DeQueue(&Q, &w);
        for (int i = w.length - 1; i >= 0; i--)
            printf("%c", w.data[i]);
        printf(" ");
    }
    printf("\n");
    return 0;
}

模拟进程调度

我们可以用队列来实现模拟进程调度。进程调度是指操作系统为了合理利用 CPU 资源,动态地将进程从就绪态调度到运行态,从而实现进程并发执行的过程。你可以将每个进程看成队列的元素,优先级高的进程先插入队列,调度的过程就是从队头取出将要执行的进程。

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

#define QUEUE_SIZE 100

typedef struct{
    int id;
    int priority;   // 进程优先级
    int remain_time;   // 剩余运行时间
}Process;

typedef struct{
    Process data[QUEUE_SIZE];   // 存放进程的数组
    int head;   // 队头指针
    int tail;   // 队尾指针
}Queue;

// 初始化队列
void InitQueue(Queue *Q)
{
    Q->head = 0;
    Q->tail = 0;
}

// 判断队列是否为空
int QueueEmpty(Queue Q)
{
    return Q.head == Q.tail;
}

// 判断队列是否已满
int QueueFull(Queue Q)
{
    return (Q.tail + 1) % QUEUE_SIZE == Q.head;
}

// 从队尾插入元素
int EnQueue(Queue *Q, Process p)
{
    if (QueueFull(*Q))    // 队列已满,插入失败
        return 0;
    Q->data[Q->tail] = p;
    Q->tail = (Q->tail + 1) % QUEUE_SIZE;
    return 1;
}

// 从队头删除元素
int DeQueue(Queue *Q, Process *p)
{
    if (QueueEmpty(*Q))    // 队列为空,删除失败
        return 0;
    *p = Q->data[Q->head];
    Q->head = (Q->head + 1) % QUEUE_SIZE;
    return 1;
}

int main()
{
    int n = 5;   // 进程数量
    Process P[n];   // 进程数组
    Queue Q;
    InitQueue(&Q);
    // 进程的初始化
    for (int i = 0; i < n; i++)
    {
        P[i].id = i;
        P[i].priority = rand() % 10;
        P[i].remain_time = rand() % 10 + 1;
        EnQueue(&Q, P[i]);
    }
    // 进行进程调度
    int time = 0;   // 系统运行的时间
    while (!QueueEmpty(Q))
    {
        printf("time = %d\n", time);
        Process p;
        DeQueue(&Q, &p);
        p.remain_time--;
        if (p.remain_time > 0)
        {
            EnQueue(&Q, p);
            printf("process%d is running (priority=%d, remain_time=%d)\n", p.id, p.priority, p.remain_time);
        }
        else
        {
            printf("process%d finished\n", p.id);
        }
        time++;
    }
    return 0;
}

以上就是 C 语言队列和应用的完整攻略,希望能帮助到大家。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言队列和应用详情 - Python技术站

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

相关文章

  • C语言实现简易贪吃蛇游戏的示例代码

    C语言实现简易贪吃蛇游戏的示例代码攻略 一、游戏规则 贪吃蛇游戏是一种经典的休闲游戏。游戏中控制一条“贪吃蛇”在一个有边界的空间中移动,通过吃食物来增长身体长度,同时不能碰到自己的身体或游戏区域的边界,否则游戏结束。 二、C语言实现 以下是一个简易的贪吃蛇游戏C语言实现的示例代码和攻略: 1. 初始化游戏 首先需要在程序中定义游戏区域的大小,以及记录蛇头、蛇…

    C 2023年5月23日
    00
  • 深入解析Python编程中JSON模块的使用

    深入解析Python编程中JSON模块的使用 什么是JSON JSON全称为JavaScript Object Notation,是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。JSON数据格式能够表示数值、字符串、布尔值、对象、数组等类型的数据。它由键值对组成,常用于Web应用程序中的数据传输。 为什么要使用JSON 由于Web应用程序越…

    C 2023年5月23日
    00
  • c++ 实现文件逐行读取与字符匹配

    首先,需要明确我们要实现的功能是文件逐行读取,并且在每一行中与指定字符进行匹配。实现这个功能的一种主流方法是使用C++语言中的文件输入输出流以及字符串处理函数。 以下是C++进行文件逐行读取并匹配字符的代码示例: #include <iostream> #include <fstream> #include <string&gt…

    C 2023年5月22日
    00
  • C++图书管理系统程序源代码

    [TOC] 背景 C++图书管理系统程序是一个非常经典的项目,主要是建立一个图书管理系统,并且提供一些简单的操作,例如:图书入库、借书、还书、查询等基本操作。在实现过程中使用了C++的基础语法,以及文件操作、结构体等知识点,适合初学C++想要练手的同学。 准备工作 在编写C++图书管理系统程序之前,需要准备好一些工具和材料: C++编译器:可以使用任何IDE…

    C 2023年5月23日
    00
  • Scala异常处理的方法深入分析

    Scala异常处理的方法深入分析 在Scala编程中,异常处理是一个很重要的概念。Scala提供了很多方式来处理异常,包括try-catch语句、抛出异常、Option等。本文将深入分析Scala异常处理的方法,并提供两个示例来说明这些方法的使用。 try-catch语句 try-catch语句是最基本的Scala异常处理方式。使用try-catch语句,我…

    C 2023年5月23日
    00
  • Linux C线程池简单实现实例

    下面是Linux C线程池简单实现实例的完整攻略。 1. 简介 线程池是一种常见的并发处理技术,其可以在创建一定数量的线程后,接受任务并将任务交给空闲的线程进行处理。从而减少线程创建和销毁的开销,优化了线程资源的利用。在Linux C中实现线程池,可以使用pthread库进行调用。 2. 实现过程 下面是实现Linux C线程池的步骤: 2.1 定义线程池结…

    C 2023年5月22日
    00
  • C 函数指针与回调函数

    C 函数指针 C 函数指针是一个指向函数的指针变量,它存储的是函数的地址,通过该函数指针可以调用被指向的函数。函数指针可以用来实现动态回调,灵活地调用不同的函数,是 C 语言中非常重要的概念之一。 函数指针的定义格式如下: 返回值类型 (* 指针变量名) (参数列表); 例如,定义一个函数指针,指向一个返回值为整型,带一个整型参数的函数,可以这样写: int…

    C 2023年5月10日
    00
  • OpenCV实现简单摄像头视频监控程序

    下面我将详细讲解OpenCV实现简单摄像头视频监控程序的完整攻略。 1. 安装OpenCV 要实现摄像头视频监控,首先需要安装OpenCV库。可以在官网(https://opencv.org/)下载安装包,也可以通过 pip 命令进行安装: pip install opencv-python 2. 开始编写代码 2.1 导入库并打开摄像头 import cv…

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