队列(C语言)

news/2024/5/17 14:41:52/文章来源:https://blog.csdn.net/weixin_61196797/article/details/127001383

文章目录

  • 前言
  • 概念
  • 基本操作
    • 循环队列
      • 少用一个元素空间
    • 栈队列


前言

本篇进行队列的学习。使用C语言实现


概念

排队是体现了“先来先服务”的原则。
在多道程序运行的计算机系统中,可以同时有多个作业运行,他们的运算结果都需要通过通道输出,若通道输入未完成,后来的作业应该排队等待,每当通道输入完成时,则从队列的对头退出作业进行输出操作。凡是申请该通道输出的作业都从队尾进行等待。
队列是另一种限定性的线性表,它只允许插入在表的一端进行,删除在表的另一端进行。允许插入的一端叫做队尾,允许删除的一端叫做队头。队列的插入操作通常称为“入队”或“进队”,而队列的删除操作称为“出队”或“退队”
当队列中无数据时,称为“空队列”
队头元素总是最先进队列,也总是最先出队列,这种表是按照“先进先出”原则组织数据的。因此队列也被称为“先进先出”表

在这里插入图片描述
如图,入队的顺序为0,1,2,3,…,n-1,则队头元素为0,队尾元素为n-1,出队顺序仍是0,1,2,3,…,n-1。

基本操作

  • InitQueue(q):队列初始化。构造了一个空队列
  • InQueue(q,x):入队操作。对于已经存在的队列q,插入一个元素x到队尾,操作成功返回TRUE,否则返回FALSE
  • OutQueue(q,x):出队操作。删除队首元素,返回其值,成功返回TRUE,否则返回FALSE
  • FrontQueue(q,x):读队头元素。读队头元素并返回其值,队列不变。操作成功返回TRUE,否则返回FALSE
  • EmptyQueue(q):判空队列操作。若q为空队列返回TRUE,否则返回FALSE

与线性表,栈类似,队列也有顺序存储和链式存储两种存储方法。队列的顺序存储结构可以简称“顺序队列“
顺序队列师指利用一组地址连续的存储单元一次存放队列中的数据元素
使用一维数组来作为队列的顺序存储空间,另外在设置两个指示器,一个为指向队头元素的指示器front,另一个为指向队尾元素的指示器rear
在C语言中,数组的下标是从0开始的,因此为了算法设计的方便,约定在初始化队列时,空队列的front = rear = -1
还约定在非空队列中,头指示器front总是指向队列中实际队头元素的前一个位置。尾指示器rear总是指向队尾元素。


typedef int ElemType;
#define MAXSIZE 50
typedef struct{ElemType elem[MAXSIZE];int rear;int front;
} SeQueue;
int main(int argc, const char * argv[]) {//定义一个指向队列的指针SeQueue* sq;//申请一个顺序队列的存储空间sq = (SeQueue*)malloc(sizeof(SeQueue));return 0;
}
  • 当设置MAXSIZE = 10,随着入队,出队的进行,会使整个队列整体向后移动,会出现图d的“假溢出”现象。
  • 队尾指针已经移动到了最后,再有元素入队就会出现“溢出”。但是此时队列并未真正满员,这是由“队尾入,队头出”的现象造成的。

在这里插入图片描述

循环队列

  • 上面我们提到了“假溢出”的现象,。接下来说说解决“假溢出‘的方法
  • 可以将队列的数据区域elem[MAXSIZE]-1看作头,尾相接的循环结构。即规定最后一个单元的后继为第一个单元。这样整个数据区就像一个环。将这样的环称为循环队列。
  • 在循环队列中,头,尾指针关系不变,头指针的指示器front总是指向队列中实际队头元素的前面一个位置,尾指针热啊热总是指向队尾元素。

在这里插入图片描述

//入队时尾指针+1的操作
sq->rear = (sq->rear+1)%MAXSIZE;   
//出队时队头指针+1的操作尾
sq->rear = (sq->front+1)%MAXSIZE;
  • 图a中具有A、B、C、D四个元素,此时front = 4,rear = 8,随着E、F、G、H、I、J入队,队中有了10个元素,已经队满。此时front = 热啊热= 4。
  • 可得在队满的情况下rear = front。
  • 若在a的情况下A、B、C、D出队,此时队空。front = rear =8。
  • 可得在空对的情况下front = rear。就是说队满和队空的条件是一样的。
  • 我们可以通过少用一个元素空间来解决队满和队空条件相同的问题,把d所示的情况视为队满,此时rear + 1 就会等于front。这种情况下队满的条件是(rear + 1 )%MAXSIZE = front。就可以和队空区别开来。
  • 也可以附设一个存储队列中的元素个数的变量,num,当num = 0时队空。当num = MAXSIZE时队满。

在这里插入图片描述

少用一个元素空间


typedef int ElemType;
#define MAXSIZE 50
typedef struct{ElemType elem[MAXSIZE];int rear;int front;
} SeQueue;
//置空队列
SeQueue* InitSeQueue(){q = (SeQueue*)malloc(sizeof(SeQueue));q->front = q->rear = MAXSIZE - 1;return q;
}
//入队
int InSeQueue(SeQueue* q,ElemType x){if ((q->rear+1)%MAXSIZE == q->front){return FALSE;}else{q->rear = (q->rear+1)%MAXSIZE;q->elem[q->rear] = x;return TRUE;}
}
//出队
int OutSeQueue(SeQueue* q,ElemType* x){if (q->front == q->rear){return FALSE;}else{q->front = (q->front + 1)%MAXSIZE;*x = q->elem[q->front];return TRUE;}
}
//判空队列
int EmptySeQueue(SeQueue* q){if (q->front == q->rear){return TRUE;}else{return FALSE;}
}

栈队列

在程序设计语言中不可能动态分配一维数组来实现循环队列。如果要使用循环队列,则必须为它分配最大长度的空间,若用户无法预计所需队列的最大空间,则可以采用链式结构来存储队列,链式存储结构称为“链队列”,和链栈类似,可以使用单链表来实现链队列。根据队列FIFO原则,链队列中为了操作方便,可以采用带头结点的单链表表示队列,并设置一个队头指针front和一个队尾指针rear。头结点始终指向头结点,尾直接指向当前最后一个元素的结点。

在这里插入图片描述
链队列的数据类型描述如下:


typedef struct{ElemType data;struct node* next;
} QNode;
typedef struct{QNode* front;QNode* rear;
} LQNode;

建立带头结点的链队列:

链队列的各种操作的实现也和单链表类似,只是限定插入操作在表尾进行,删除操作在表头进行。它的插入和删除是单链表的特殊情况,
在链队列的删除操作中,如果仅有一个元素结点,删除后还需要修改尾指针。

在这里插入图片描述

//创建一个带头结点的空队
LQueue* Init_LQueue(){LQueue* q;QNode* p;q = (LQNode*)malloc(sizeof(LQNode));p = (QNode*)malloc(sizeof(QNode));p->next = NULL;q->front = q->rear = p;return q;
}
//入队
void InLQueue(LQueue* q,DataType* x){QNode* p;p = (QNode*)malloc(sizeof(QNode));p->data = x;p->next = NULL;q->rear->next = p;q->rear = p;
}
//队判空
int Empty_LQueue(LQueue* q){if (q->front == q->rear){return 0;} else{return TRUE;}
}
//出队
int Out_LQueue(LQueue* q,DataType* x){QNode* p;if (Empty_LQueue(q)){return FALSE;} else{p = q->front->next;q->front->next = p->next;*x = p->data;free(p);if (q->front->next == NULL){q->rear = q->front;}}return TRUE;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_12882.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[架构之路-3]:软件架构师也是魔法师,架构师应具备的四大方面的技能

目录 前言: 一、业务能力(业务领域)-- 面向业务 1.1 业务场景 1.2 业务技能 二、沟通能力(管理领域) -- 面向“人” 三、技术能力(计算机领域) -- 面向计算机 3.1 硬件技能 3.2 软件技能…

一个有点意思的网站 - 语雀

在这个平台上面创建了一个文档:CWIKIUS 语雀 Confluence Confluence 的问题就是太臃肿,不兼容 MD 格式。 但是,Confluence 和 JIRA 重度集成,因此成为很多公司文档的标配。 语雀 试用了下这个文档工具,整体上来说…

我们如何一键将录音转换成文字?

最近有很多小伙伴向我求助说,他的职业是一名记者,因为每次采访都要进行对话录音,可是每次结束后都需要再去对录音进行整理,花费了大量的时间。因此他总是在加班,他想改变这一现状却不知道该怎么办。其实我们不必如此麻…

platform.pk8 和platform.x509.pem转jks

/** OpenSSL */ 下载地址:http://slproweb.com/products/Win32OpenSSL.html 环境配置: openssl 安装后查看是否安装成功,需要以管理员身份运行cmd查看 cmd输入openssl出现下面显示,表示配置成功,openssl可以使用 pla…

VUE v-bind 数据绑定

动态的绑定一个或多个 attribute,也可以是组件的 prop。缩写: : 或者 . (当使用 .prop 修饰符) 期望: any (带参数) | Object (不带参数) 参数: attrOrProp (可选的) 修饰符:.camel ——将短横线命名的 attribute 转变为驼峰式命名。 .prop ——强制绑定为 DOM property。…

kafka 安装

目录 Docker安装 1.安装Docker 2.搜索docker镜像 3.安装Zookeeper 4. 安装kafka 5.启动kafka ​​​​​​​ Linux安装 1.kafka下载 2.安装JDK 3.安装zookeeper 4.安装kafka 5.启动kafka zookeeper上查看kafka的节点 1.进入zookeeper容器 2.运行客户端 3.查看ka…

MongoDB --- 聚合查询

什么是聚合查询 聚合操作处理数据记录并返回计算结果。聚合操作组值来自多个文档,可以对分组数据执行各种操作以回单个结果。聚合操作包含三类:单一作用聚合、聚合管道、MapReduce(在5.x已经弃用)。 单一作用聚合 提供了对常见聚合过程的简单访问,操作都从单个集合聚合文…

网络笔记大全(超详细)

目录 OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 封装和解封装 应用层 传输层 网络层 数据链路层 物理层 PDU --- 协议数据单元应用层 --- 报文 传输层 --- 段 网络层 --- 包 数据链路层 --- 帧 物理层 --- 比特流 Sof --- 帧首…

日本25年来首次干预以支撑日元汇率

日本周四自 1998 年以来首次干预外汇市场,以支撑暴跌的日元,此前日本央行决定维持超低利率,这一决定已对日元造成冲击。 KlipC 风险经理 Philip Nucci 周五表示:“他们(在外汇市场)采取了果断行动&#xff…

pytorch神经网络入门(三)

一、建立简单的卷积神经网络 import torch from torch import nnclass ConvNet(nn.Module):def __init__(self):super(ConvNet, self).__init__()self.conv1 nn.Sequential(nn.Conv2d(1, 16, 3, 1, 1),nn.ReLU(),nn.AvgPool2d(2, 2))self.conv2 nn.Sequential(nn.Conv2d(16,…

Vue学习第29天——路由的props配置项的详解与案例(对比组件props配置项)

目录一、组件的props配置项1、作用2、理解3、用法二、路由的props配置项1、作用2、理解3、用法① props值为对象② props值为布尔值③ props值为函数4、接收参数三、props配置项搭配params传参案例练习四、props配置项搭配query传参案例练习五、总结在学习路由的props配置项之前…

python机器人编程——差速机器人小车的控制,控制模型、轨迹跟踪,轨迹规划、自动泊车(中)未完待续...

目录一、前言二、轨迹的跟随控制策略(1)利用模型预测控制(MPC)的思想控制(2) 仿真验证一、前言 本篇我们依然试着用一些浅显的数学知识,来研究和实现一下常用机器人小车(如AGV&…

异常值检测!最佳统计方法实践(代码实现)!

💡 作者:韩信子ShowMeAI 📘 Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40 📘 本文地址:https://ww…

Mysql数据库高阶语句

目录 一,正则表达式 1,以“.”代替任意一个字符 2,匹配前面字符多次 3,匹配前面字符至少一次 4,匹配字符串 5,匹配包含或者关系的记录 6,匹配指定字符集中的任意一个 二,运算符 1、算数运算 2…

linux在线安装JDK1.8

​​​​​创建文件路径 [rootlocalhost ~]# cd /usr/local/ [rootlocalhost local]# mkdir java [rootlocalhost local]# cd java 在线下载连接地址 wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http:…

MyBatis——案例——查询-查询所有

查询-查询所有数据1、创建相应Mapper接口文件 以及Mapper配置信息文件 修改配置文件中 namespace :2、编写接口方法:Mapper 接口参数:无结果:List<Brand>3、编写SQL语句(接口文件中按Alt+回车快速编写)4、执行方法,测试(1)获取 SQLSessionFactory 对象//1、获取…

超越美国 中国IPv6地址重回世界第一

IPv6的背景 IPv4地址空间已经消耗殆尽&#xff0c;近乎无限的地址空间是IPv6的最大优势 IPv6基本报头 在IPv4的基础上增加了流标签&#xff0c;去掉了一些冗余字段&#xff0c;使报文头部的处理更 为简单、高效 IPv6扩展报头 是跟在IPv6基本报头后面的可选报头&#xff0c;可…

互联网时代在改变,程序员不再是只会敲代码的工具人

近两年收到新冠疫情的影响&#xff0c;加速了企业数字化信息的转型速度&#xff0c;而低代码也再次成为互联网时代的红榜。从技术的角度来看&#xff0c;低代码平台最大的好处就是提升了开发的效率&#xff0c;同时调整起来也会更方便一些&#xff0c;这对于IT公司来说会有较强…

数据湖技术之 Hudi 框架概述

第一章 Hudi 框架概述 先了解什么是数据湖DataLake&#xff0c;及Hudi 数据湖框架功能及各个版本特性。 文章目录第一章 Hudi 框架概述1.1 数据湖Data Lake1.1.1 仓库和湖泊1.1.2 什么是数据湖1.1.4 Data Lake vs Data warehouse1.1.5 数据湖框架1.1.5.1 Delta Lake1.1.5.2 Ap…

MyBatis——案例——环境准备

配置文件完成增删改查 准备环境数据库表 tb_brand-- 创建tb_brand表 create table tb_brand(id int primary key auto_increment, -- 主链brand_name varchar(20), -- 品牌名称company_name varchar(20), -- 公司名称orderd int, -- 排序字段…