C语言数据结构与算法--简单实现队列的入队和出队

news2024/11/27 9:00:48

 (一)队列的基本概念

        和栈相反,队列(Queue)是一种先进先出(First In First Out)的线性表。只 允许在表的一端进行插入,而在另一端删除元素,如日常生活中的排队现象。队列中 允许插入的一端叫队尾(rear),允许删除的一端称队头(front)。假设队列为 q=(a1, a2, …, an),则 a1 为队头元素, an 为队尾元素。队列中出队的顺序和进队顺序一 致。队列的基本操作与栈类似,包括:初始化、清空、销毁、求长度、得到对头元 素、插入、删除。

(二)队列的表示形式

队列的表示形式有两种:队列的链式表示、队列的顺序表示。 

1.队列的链式表示

        用链表来表示的队列,简称链队列。在这种表示形式中,需要两个分别指向队头(front 或 head)和队尾(rearh 或 end)的指针。与线性 表的单链表类似,需要设置头结点。队列为空的 条件是队头指针和队尾指针均指向头结点。实际 上链队列的操作为单链表的插入和删除操作的特 殊情况。

        链队列插入与删除元素时的指针变化情况如 下图。

2.队列的顺序表示

        队列的顺序表示用一组地址连续的存储单元依次存放从队头(front)到队尾 (rear)的元素。此外,还需要设置两个指针分别指向队头元素和队尾元素。初始化 时 Q. front = Q.rear = 0,插入元素时尾指针加 1,删除元素时,头指针增加 1。

        为保证插入新元素时不会使数组越界,并充分利用队头删除元素后的空间,可 设计一个环行空间,构成循环队列。但是,凭 Q.front = Q.rear 无法判断队列是满 还是空。处理方法有两种:一是设标志,二是少用一个元素空间。特点是无法用动态 分配的一维数组实现循环队列。

(三)循环队列入队、出队实现思路

1.循环队列入队算法

        入队算法过程为:判断队列是否已满?如果已满则退出;否则,队尾指针加 1, 并在队尾插入新的元素。

2.循环队列出队算法

        出队算法过程为:判断队列是否为空?如果为空则退出;否则,队头指针加 1,并删除队头元素。

(四)算法实现

队列的顺序表示

#define _CRT_SECURE_NO_WARNINGS  
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 12  //设置循环队列的最大存储元素个数

typedef struct {
    int* base;
    int front;
    int rear;
} queue;

//队列初始化
void InitQueue(queue* Q)
{
	//为队列分配存储空间
	Q->base = (int*)malloc(sizeof(int) * MAX_SIZE);
	Q->front = Q->rear = 0;
}
//入队操作
void InputQueue(queue* Q, int x)
{
	//判断循环队列是否已满
	if (((Q->rear + 1) % MAX_SIZE) == Q->front)
		return;
	//队列未满,将数据入队
	Q->base[Q->rear] = x;
	Q->rear = (Q->rear + 1) % MAX_SIZE;
}
//出队操作
void OutputQueue(queue* Q)
{
	if (Q->front == Q->rear)
		return;
	//如果非空,实现可循环出队
	Q->front = (Q->front + 1) % MAX_SIZE;
}

void ShowQueue(queue* Q)
{
	//遍历循环队列中的元素,并将数据打印
	for (int i = Q->front; i != Q->rear;)
	{
		printf("%d ", Q->base[i]);
		i = (i + 1) % MAX_SIZE;
	}
	printf("\n");
}

void main() {
	queue Q;
	InitQueue(&Q);
	int n;
	printf("请输入入队个数n:\n");
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		int data;
		printf("请输入第%d个入队元素:\n",i+1);
		scanf("%d", &data);
		InputQueue(&Q, data);
	}
	printf("入队:\n");
	ShowQueue(&Q);
	OutputQueue(&Q);
	printf("出队:\n");
	ShowQueue(&Q);

}


运行结果:

          至于队列的链式表示和环形表示大家可以自己做做,环形表示思路也在上面,链式表示大家可以仿照我之前写的线性表的链式表示和栈的链式表示。

最后。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

听说点赞、收藏加关注的人都能长命千岁,万事如意。。。。。。。。。。。。。。。。。。。。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速理解微服务中Sentinel怎么实现限流

Sentinel是通过动态管理限流规则&#xff0c;根据定义的规则对请求进行限流控制。 一.实现步骤 1.定义资源&#xff1a;在Sentinel中&#xff0c;资源可以是URL、方法等&#xff0c;用于标识需要进行限流的请求&#xff1b;(在Sentinel中&#xff0c;需要我们去告诉Sentinel哪些…

matlab根据excel表头筛选表格数据

有如下表格需要筛选&#xff1a; 如果要筛选style中的A&#xff0c;color中的F2&#xff0c;num中的3。 代码如下&#xff1a; clear;clc; file_Pathstrcat(F:\csdn\,test1.xlsx); %表格路径、文件名 E1readtable(file_Path,Sheet,1); %读取表格中的字母和数字,1代表第一个…

学习日志016--python实现双向循环列表与链栈

python中一些复合数据结构通过类的封装来实现的。双向循环链表与链栈也在其中。 双向循环链表 双向循环链表是一种特殊类型的链表&#xff0c;它结合了双向链表和循环链表的特点。在双向循环链表中&#xff0c;每个节点不仅包含数据&#xff0c;还持有指向前一个和后一个节点的…

【Docker】常用命令汇总

Docker 是1个开源的应用容器引擎&#xff0c;基于Go 语言并遵从 Apache2.0 协议开源。 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&#xff0c;相…

QT QRadioButton控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

Docker部署mysql:8.0.31+dbsyncer

Docker部署mysql8.0.31 创建本地mysql配置文件 mkdir -p /opt/mysql/log mkdir -p /opt/mysql/data mkdir -p /opt/mysql/conf cd /opt/mysql/conf touch my.config [mysql] #设置mysql客户端默认字符集 default-character-setUTF8MB4 [mysqld] #设置3306端口 port33…

[SUCTF 2019]EasySQL--详细解析

信息搜集 进入界面是一个搜索框&#xff1a; 查看一下源代码&#xff0c;显示是POST传参&#xff1a; 随便上传个数字1&#xff1a; 抓包测试一下闭合&#xff0c;发现以双引号闭合会回显nonono,单引号闭合则无回显。 由于没有报错信息&#xff0c;所以我们不能确定具体的闭…

警钟长鸣,防微杜渐,遨游防爆手机如何护航安全生产?

近年来&#xff0c;携非防爆手机进入危险作业区引发爆炸的新闻屡见报端。2019年山西某化工公司火灾&#xff0c;2018年延安某煤业瓦斯爆炸&#xff0c;均因工人未用防爆手机产生静电打火引发。涉爆行业领域企业量大面广&#xff0c;相当一部分企业作业场所人员密集&#xff0c;…

【智能流体力学】RAG大模型方法:解决固体力学和流体动力学问题

【使用 AutoGen + GPT-4o + Chainlit UI 进行工程仿真的对话式多智能体 AI 聊天机器人】 本项目构建了一个由多个AI代理组成的系统,这些代理通过使用Microsoft AutoGen进行对话交互,能够自主地创建和仿真固体力学(FEA)和流体动力学(CFD)问题。每个AI代理都擅长规划、问题…

Redis与MySQL如何保证数据一致性

Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时&#xff0c;才会发生数据不一致。 主要流程就是要么先操作缓存&#xff0c;要么先操作Redis&#xff0c;操作也分修改和删除。 一般修改要执行一系列业务代码&#xff0c;所以一般直接删除成本较低…

Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 在充满活力与激情的校园生活中&#xff0c;校运会不仅是…

【西瓜书】神经网络-MP神经元、感知机和多层网络

神经网络&#xff08;neural networks&#xff09;的定义&#xff1a;神经网络是由具有适应性的简单单元组成的广泛并行互联的网络&#xff0c;它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。&#xff08;T. Kohonen 1988年在Neural Networks创刊号上给出的定义…

《安富莱嵌入式周报》第346期:开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波,开源固件安全分析器, 开源口袋电源,开源健康测量,FreeCAD

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频&#xff1a; https://www.bilibili.com/video/BV1TYBhYKECK/ 《安富莱嵌入式周报》第346期&#xff1a;开源2GHz带…

介绍一下atoi(arr);(c基础)

hi , I am 36 适合对象c语言初学者 atoi(arr)&#xff1b;是返回整数(int型)&#xff0c;整数是arr数组中字符中数字 格式 #include<stdio.h> atoi(arr); 返回值arr数组中的数字 未改变arr数组 #include<stdlib.h>//atoi(arr); 返 <stdlib> int main(…

Docker: 教程07 - ( 如何对 Docker 进行降级和升级)

如果我们使用 docker 来管理容器&#xff0c;那么保持 docker 引擎的更新将会是十分重要的&#xff0c;这一篇文章我们将会讨论如何对Docker 进行降级和升级。 准备工作 - docker 环境 我们需要拥有一个安装好 docker 的运行环境。 如果你需要了解如何安装 docker 可以通过如…

ArcGIS pro中的回归分析浅析(加更)关于广义线性回归工具的补充内容

在回归分析浅析中篇的文章中&#xff0c; 有人问了一个问题&#xff1a; 案例里的calls数据貌似离散&#xff0c;更符合泊松模型&#xff0c;为啥不采用泊松而采用高斯呢&#xff1f; 确实&#xff0c;在中篇中写道&#xff1a; 在这个例子中我们为了更好地解释变量&#x…

第R4周:LSTM-火灾温度预测(TensorFlow版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 往期文章可查阅&#xff1a; 深度学习总结 任务说明&#xff1a;数据集中提供了火灾温度&#xff08;Tem1&#xff09;、一氧化碳浓度…

《操作系统 - 清华大学》5 -4:虚拟技术

文章目录 0. 虚拟存储的定义1. 目标2.局部性原理3. 虚拟存储的思路与规则4. 虚拟存储的基本特征5. 虚拟页式存储管理5.1 页表表项5.2 示例 0. 虚拟存储的定义 1. 目标 虚拟内存管理技术&#xff0c;简称虚存技术。那为什么要虚存技术&#xff1f;在于前面覆盖和交换技术&#…

MYSQL 表的增删改查(上)

目录 1.新增数据 2.查询数据 一般查询 去重查询 排序查询 关于NULL 条件查询 分页查询 1.新增数据 语法&#xff1a;insert into 表名[(字段1&#xff0c;字段2...)] values (值&#xff0c;值....); 插入一条新数据行&#xff0c;前面指定的列&#xff0c;要与后面v…

OSPTrack:一个包含多个生态系统中软件包执行时生成的静态和动态特征的标记数据集,用于识别开源软件中的恶意行为。

2024-11-22 &#xff0c;由格拉斯哥大学创建的OSPTrack数据集&#xff0c;目的是通过捕获在隔离环境中执行包和库时生成的特征&#xff0c;包括静态和动态特征&#xff0c;来识别开源软件&#xff08;OSS&#xff09;中的恶意指标&#xff0c;特别是在源代码访问受限时&#xf…