C语言队列和应用详情

yizhihongxing

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语言实现贪吃蛇游戏设计攻略 简介 贪吃蛇游戏是一款非常经典的小游戏,它在很多平台上都有实现,如PC、移动设备等。本攻略的目的是介绍如何使用C语言实现贪吃蛇游戏。 设计思路 初始化游戏 绘制界面 进行游戏循环 获取用户输入 移动蛇 判断蛇是否吃到食物 生成新的食物 判断游戏是否结束 游戏结束,清理资源 代码实现 初始化游戏 在开始游戏前,需要初始化游戏所需要…

    C 2023年5月23日
    00
  • 2048小游戏C语言实现代码

    首先,2048小游戏是一款经典的益智游戏,玩家需要通过合并数字达到2048的目标。对于C语言实现,代码可以分为几个部分:界面显示、随机数字生成、输入处理、数字移动和合并、判断游戏是否结束。 界面显示 为了在终端中显示2048的游戏界面,我们需要使用C语言的库函数ncurses。首先,需要安装ncurses库,在Ubuntu系统下使用以下命令安装: sudo …

    C 2023年5月24日
    00
  • Python中json.load()和json.loads()有哪些区别

    当我们使用Python进行处理JSON数据时,常常需要用到json模块中的load()和loads()方法。这两个方法都可以将JSON格式的字符串转化为Python对象,但是具体的使用方法和功能是不同的。 区别1:接收的参数类型不同 json.load()方法是将文件中的JSON格式数据转化为Python对象,即需要传入一个可读文件对象作为参数。例如: im…

    C 2023年5月23日
    00
  • ccleaner注册码详解

    CCleaner注册码详解 CCleaner是一款非常受欢迎的系统清理工具,它能够帮助我们清理垃圾文件、清理注册表以及卸载软件等。在使用CCleaner时,我们经常会需要注册码来激活其高级版功能。本文将详细讲解如何获得CCleaner注册码以及如何使用。 获得CCleaner注册码 1. 购买CCleaner正版 最简单的获取CCleaner注册码的方法就是…

    C 2023年5月23日
    00
  • C++执行shell命令的多种实现方法

    C++可以通过多种方式执行shell命令,以下是其中的一些常见方法。 使用system函数 system函数是最简单和常见的执行shell命令的方法,可以通过将命令字符串作为参数传递给system函数来执行命令。例如,以下代码将显示当前目录中的所有文件列表: #include <cstdlib> int main() { system(&quot…

    C 2023年5月23日
    00
  • 详解python 3.6 安装json 模块(simplejson)

    安装json模块(simplejson)可以帮助我们在Python 3.6中更方便地处理JSON数据格式。下面是安装和使用simplejson的完整攻略。 安装simplejson模块 要安装simplejson模块,可以使用pip命令在控制台进行安装。输入以下命令: pip install simplejson 如果你使用的是Python 3.6及以上版本…

    C 2023年5月23日
    00
  • 拳皇97大门bug震的全人物整理

    拳皇97大门bug震的全人物整理攻略 什么是大门bug震? 在拳皇97中,存在一个被称为“大门bug”的漏洞。使用此漏洞可以通过特定按键组合让对手的活力值瞬间降为0,从而轻松获胜。而“大门bug震”则是一种利用此漏洞的特定攻击方式,使整个对手团队都受到震动效果,从而更容易实现胜利。 如何进行“大门bug震”? 要进行“大门bug震”,需要先使用一定的招数组合…

    C 2023年5月22日
    00
  • PHP错误处理函数

    当 PHP 程序出错时,可以通过使用 PHP 错误处理机制来捕获并处理错误,PHP 为我们提供了一系列的错误处理函数来实现这一功能: 错误类型 PHP 内置了多种类型的错误,下面来简单介绍一下: E_ERROR 表示严重的错误,程序无法恢复运行,例如访问一个不存在的方法或函数 E_WARNING 表示警告信息,程序可以继续运行,但可能出现问题,例如访问一个未…

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