C语言实现队列

c语言实现队列 阅读详情

队列是一种常用的数据结构,它是一种先进先出(FIFO)的线性表,也就是说,只能在一端(称为队尾)插入元素,而在另一端(称为队头)删除元素。队列的应用场景很多,比如操作系统中的进程调度、网络中的数据包传输、打印机的任务缓冲等等。

本文将介绍如何用 C 语言实现一个简单的队列,并给出相关的代码和测试示例。

队列的定义

要实现一个队列,我们首先需要定义一个队列的结构体,它包含以下几个成员:

  • data:一个数组,用来存储队列中的元素。
  • front:一个整数,表示队头元素的下标。
  • rear:一个整数,表示队尾元素的下标。
  • maxsize:一个整数,表示队列的最大容量。
// 队列的结构体定义
typedef struct Queue {
    int *data; // 队列元素数组
    int front; // 队头下标
    int rear; // 队尾下标
    int maxsize; // 队列最大容量
} Queue;

队列的初始化

要初始化一个队列,我们需要分配一定大小的内存空间给 data 数组,并将 front 和 rear 都设为 -1,表示队列为空。同时,我们需要传入一个参数 size,表示队列的最大容量,并将其赋值给 maxsize。

// 队列的初始化函数
Queue *initQueue(int size) {
    Queue *q = (Queue *)malloc(sizeof(Queue)); // 分配内存空间给队列结构体
    q->data = (int *)malloc(sizeof(int) * size); // 分配内存空间给队列元素数组
    q->front = -1; // 设置队头下标为 -1
    q->rear = -1; // 设置队尾下标为 -1
    q->maxsize = size; // 设置队列最大容量为 size
    return q; // 返回队列指针
}

队列的判空和判满

要判断一个队列是否为空,我们只需要检查 front 和 rear 是否相等。如果相等,说明队列为空;否则,说明队列不为空。

// 队列的判空函数
int isEmpty(Queue *q) {
    return q->front == q->rear; // 如果队头下标等于队尾下标,返回 1;否则返回 0
}

要判断一个队列是否已满,我们需要考虑两种情况:

  • 如果 rear + 1 == maxsize,说明队尾已经到达数组的最后一个位置,且数组已经被填满。
  • 如果 rear + 1 == front,说明队尾已经绕回到数组的第一个位置,且数组已经被填满。
// 队列的判满函数
int isFull(Queue *q) {
    return (q->rear + 1) % q->maxsize == q->front; // 如果 (队尾下标 + 1) 对最大容量取余等于队头下标,返回 1;否则返回 0
}

队列的入队和出队

要实现一个元素入队,我们需要先判断队列是否已满。如果已满,则无法入队;否则,将元素放入 rear + 1 的位置,并更新 rear 的值。注意,这里我们使用了取余运算符 % 来实现循环数组的效果。

// 队列的入队函数
void enqueue(Queue *q, int x) {
    if (isFull(q)) { // 如果队列已满,打印错误信息并返回
        printf("Queue is full!\n");
        return;
    }
    q->rear = (q->rear + 1) % q->maxsize; // 更新队尾下标
    q->data[q->rear] = x; // 将元素放入队尾位置
}

要实现一个元素出队,我们需要先判断队列是否为空。如果为空,则无法出队;否则,将 front + 1 的位置的元素返回,并更新 front 的值。同样,这里我们使用了取余运算符 % 来实现循环数组的效果。

// 队列的出队函数
int dequeue(Queue *q) {
    if (isEmpty(q)) { // 如果队列为空,打印错误信息并返回 -1
        printf("Queue is empty!\n");
        return -1;
    }
    q->front = (q->front + 1) % q->maxsize; // 更新队头下标
    return q->data[q->front]; // 返回队头位置的元素
}

队列的测试

为了测试我们实现的队列是否正确,我们可以编写一个简单的测试程序,如下:

// 队列的测试程序
int main() {
    Queue *q = initQueue(5); // 初始化一个最大容量为 5 的队列
    enqueue(q, 1); // 入队元素 1
    enqueue(q, 2); // 入队元素 2
    enqueue(q, 3); // 入队元素 3
    printf("%d\n", dequeue(q)); // 出队元素,打印 1
    printf("%d\n", dequeue(q)); // 出队元素,打印 2
    enqueue(q, 4); // 入队元素 4
    enqueue(q, 5); // 入队元素 5
    enqueue(q, 6); // 入队元素 6
    enqueue(q, 7); // 尝试入队元素 7,打印错误信息
    printf("%d\n", dequeue(q)); // 出队元素,打印 3
    printf("%d\n", dequeue(q)); // 出队元素,打印 4
    printf("%d\n", dequeue(q)); // 出队元素,打印 5
    printf("%d\n", dequeue(q)); // 出队元素,打印 6
    printf("%d\n", dequeue(q)); // 尝试出队元素,打印错误信息并返回 -1
    return 0;
}

运行结果如下:

1
2
Queue is full!
3
4
5
6
Queue is empty!
-1

可以看到,我们实现的队列符合预期的功能和逻辑。

本文介绍了如何用 C 语言实现一个简单的队列,并给出了相关的代码和测试示例。希望这篇文章对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。

用两个队列实现栈——C语言实现 如何用两个队列实现栈? 思路分析:建立队列q1,在第队列中入队元素1,2,3,4。 我们知道,队列是先进先出的,如果出队的话,得到的元素是1,而不是4。而按照栈的要求,出栈的元素应该是4. 那么怎样得到队列的最后一个元素4呢?这个时候,就要借助第二个队列了。建立空队列q2,我们可以将队列的中元素一个个出队,然后将出来的元素入队到队列q2中。这样,分别将1,2,3从队列q1中出队,然后入队队列... 阅读详情

相关推荐

力扣232 - 用栈实现队列【C语言实现】

力扣232 - 用栈实现队列,教你如何使用双栈实现队列操作

做技术人 · 产优质博客 · 找好工作 2310

数据结构——队列的C语言代码实现

系列文章目录 数据结构——顺序表的C语言代码实现 数据结构——八种链表的C语言代码实现 数据结构——栈的C语言代码实现 文章目录系列文章目录前言一、基础知识队列的概念(queue)二、代码实现1.queue.h2.queue.c3.test.c总结 前言 主要实现链式队列。 提示:以下是本篇文章正文内容,下面案例可供参考 一、基础知识 队列的概念(queue) 援引百科: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,

AZ10000000的博客 4449

C语言实现队列操作(附完整源码)

以上是使用数组实现队列操作的源码和相应描述,通过它可以更好地理解队列的实现原理、数据结构的设计思路,同时也为读者提供了一份可直接使用的代码。入队操作,若队列已满则输出提示信息并返回,否则将元素插入到队列尾,并将队列尾指针加1,若队列为空则将队列头指向第一个元素。测试函数,初始化队列,入队五个元素并输出队列,依次出队两个元素并重新入队两个元素,最终输出更新后的队列。定义队列的结构体类型Queue,其中data数组存储队列元素,front和rear分别指向队列头和尾。队列初始化函数,将队列头和尾初始化为-1。

PixelDude的博客 395

队列的实现(C语言)

队列的定义队列的顺序存储-->循环队列方案1:牺牲一个单元来区分队空和队满方案2:增设表示元素个数的变量(不牺牲存储单元)方案3:增设tag数据成员区分队空队满(不牺牲存储单元)链式队列的实现带头结点的链式队列不带头结点的链式队列 队列的定义 队列(Queue) 是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。 队列操作的特性:先进先出(Frist In First Out) 队列的顺序存储–>循环队列 方案1:牺牲一个单元来区分队空和队满 实现: // .

qq_931027577 1万+

Synopsys PCIe IP 实战笔记:手把手教你配置本地数字回环(PIPE/RMMI)

本文详细介绍了Synopsys PCIe IP本地数字回环(PIPE/RMMI)的配置与调试全流程,涵盖硬件连接、寄存器操作及实战技巧。通过数字回环模式,开发者可在无真实对端设备的情况下验证PCIe接口功能,适用于芯片验证和FPGA原型开发。文章还提供了常见问题排查和性能优化建议,助力高效完成协议解析与调试。

weixin_30394669的博客 323

若依框架-实现管理端与用户端的不同页面布局

我们现在要做的是:管理员登录时展示后台管理端,普通用户登录时展示我们自己写的页面。所以我们可以用v-if来判断登录用户的角色,如果用户角色包含admin,说明是管理员,渲染管理端相关组件,否则渲染用户端组件。不过若依作者的本意还是想退出系统后清空角色信息,所以为了保险期间,我们可以在退出系统后,延迟2秒,再单独清空角色信息。当我们登录管理端后,再退出登录,会有那么一瞬间渲染用户页面,然后才是回到登录界面。这个时候,前端检测到角色信息为空,不包含admin,于是就会渲染用户页面。用来延迟 2 秒执行。

m0_74462339的博客 1566

队列c语言实现

队列是一种数据结构,这种结构的特点是先进先出,后进后出。有点类似于数组只能尾插和头删。不过我们不用数组实现队列,因为数组的头删需要挪动后面所有的数据,成本过高。我们采用单链表来实现队列.

btzxlin的博客 1039

高速设计注意事项总结——MDI篇

在以太网高速通信系统中,MDI(Medium Dependent Interface,介质相关接口)是连接物理层芯片(PHY)与传输介质(如网线)的关键接口,其设计直接影响信号完整性、传输速率和抗干扰能力。本文围绕 MDI 及 RJ45 接口电路、关键参数、设计与布线要点展开,为高速以太网设计提供参考。本文包含MDI 及 RJ45 接口电路组成、电路设计注意事项、布局布线要求等内容

qq_16237389的博客 1445

队列——(c语言实现)

队列,是一种先进先出(first in first out 简称FIFO)的数据结构,是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,在队列中,进行插入的一端称为队尾,进行删除的一端称为队头。

2302_77041624的博客 3694

RTKLIB模糊度固定实战:三种模式对比与部分模糊度固定代码解析

本文深入解析RTKLIB中模糊度固定的三种核心模式(continuous、instantaneous、fix and hold),对比其性能与适用场景,并详细拆解了部分模糊度固定技术的源码实现。通过实战案例与代码级解析,为GNSS高精度定位开发者提供了在不同数据特性下提升固定成功率的优化思路与配置建议。

efc1234567的博客 473

ABB AC500 系列 PLC 与上位机iFix 的通讯配置

在 软件中,有 3 种方式可以进入 IP config tool 的配置界面 双击 IP_settings,点击 IP config tool,即可进入 IP config tool 界面点击菜单栏的 Tool→IP config如果单独安装了 ABB IP Configration,则可以通过开始→程序→ABB→ABB IPConfigration 启动 IP 配置工具启动 IP config tool 后,即可进入 IP 配置界面。

xdpcxq的专栏 4031

用链表实现的C语言队列

C语言链表实现队列

Broken_x的博客 3232

Xilinx平台SRIO介绍(一)RapidIO协议介绍

菜鸟到老鸟:会用工具; 老鸟到大佬:深入理解原理。 ——FPGA大叔·沃自己硕得

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

队列(Queue) C 语言实现

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素成为出队。队列中没有元素时,称为空队列。因为队列只允许在一段插入,在另一端删除,所以只有最早进入队列

song_hui_xiang 3万+

26、多级快速多极子算法(MLFMA)在大规模电磁问题中的应用

本文探讨了多级快速多极子算法(MLFMA)在大规模电磁问题中的高效应用。通过分层分区策略,MLFMA在分布式内存架构上实现了高效并行化,能够求解包含数亿未知数的复杂电磁问题。文章分析了介质球体、半球透镜、周期性结构和损耗介质阵列等典型案例,验证了MLFMA的高精度与广泛适用性。同时,MLFMA被应用于实际场景如隐身目标Flamme的外部共振分析和含分裂环谐振器的超材料设计,展示了其在航空航天、超材料和生物医学等领域的广阔前景。未来发展方向包括算法优化、多物理场耦合和实时计算,进一步拓展其应用潜力。

t8u9v0w1x的博客 117

【Flink】FLink session yarn kerberos认证报错 PortUnreachableException: ICMP Port Unreachable

本篇博客是在上一篇博客:【Flink】FLink session yarn kerberos认证报错 KrbException: Cannot locate default realm还没找到原因的时候做的一次尝试。因为项目需要,我们需要对接华为认证的yarn集群,运行flink任务,我们的任务分为两种,yarn pre-job模式和flink session模式。我们在配置文件中配置如下# kerberos认证需要的东西提交任务的脚本如下。

九师兄 1267

C语言队列的实现

C语言利用单链表实现队列的先进先出操作。难点在数据结构的使用。 代码如下: #include<stdio.h> #include<stdlib.h> typedef int elemtype, QElemType; #define OVERFLOW 0 typedef struct link { elemtype data; link *next; }link,*QueuePtr; typedef struct linkqu

a1561216的博客 1638

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C语言实现数组队列

#include <iostream> #define QUEUE_SIZE 20 typedef struct queue { unsigned int array[QUEUE_SIZE]; int front; int rear; int counter; } ARRAY_QUEUE_S; void init_queue(ARRAY_QUEUE_S *_queue) { _queue->front = 0; _queue->r

lala0903的博客 917

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【C语言】用栈实现队列/用队列实现栈

在学习过基础的数据结构后,我们知道,栈遵循“后进先出”(LIFO, Last In First Out)原则的,而队列遵循“先进先出”(FIFO, First In First Out)原则。通过一定的手段,我们可以使用栈来实现队列,或者使用队列来实现栈。由于本篇使用C语言进行编写,C语言不具备栈和队列两种基础类型,因此在实现标题两部分内容之前,我们首先需要先对栈和队列进行实现。为什么还要定义一个Queue结构体存储头尾指针?

2301_79876947的博客 366

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构——C语言实现队列

C语言实现队列 1.队列的结构及相关概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)的特性。 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 2.队列的实现: 队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会...

我爱吃香锅的博客 2383

队列的实现—C语言

队列的实现 头文件 #pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef int QDataType; typedef struct QueueNode { QDataType _data; struct QueueNode* _next; }Queu...

weixin_43554618的博客 140
上一篇: KICAD一按键盘就卡死6.X 7.X 版本都是一样~
下一篇: 字符串中指定位置插入字符串---->C语言实现(代码块)
DennisReYoonjiho
博客等级 码龄7年 216粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值