数据结构---栈和队列之顺序队(C语言)

数据结构的在C语言中的类型定义 数据结构线性顺序表链表单链表双链表循环链表栈顺序栈链栈队列顺序队链队串顺序串链串树树双亲存储结构孩子存储结构孩子兄弟链存储结构二叉树顺序存储结构链式存储结构图邻阶矩阵存储方法邻接表存储方法 线性 顺序表 typedef struct ElemType data[MAXSIZE]; int length; }SqList;//顺序表类型 链表 单链表 typedef struct LNode { ElemType data; struct LNode* next; }LinkNode;//单链表结点 阅读详情

队列简称队,它也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入,在表的另一端进行删除。
可进行插入的一端称为队尾(Rear),可进行删除的一端称为队头(Front)。

向队列中插入新元素称为进队,新元素进队后就成为新的队尾元素;

从队列中删除元素称为出队,元素出队后,其后继元素成为新的队头元素。
队列的特点:先进先出(FIFO)

队列的存储结构也分为两种,顺序队和链队

----------------------------------------------------------------------------------------------------------------------------------

顺序队中,通常让队尾指针rear指向刚进队的元素位置,让队首指针front指向刚出队的元素位置。因此,元素进队时,rear要向后移动;元素出队时,front也要向后移动。经过一系列的出队和进队操作后,两个指针最终会达到数组末端maxSize-1处。虽然队中已经没有元素,但仍然无法让元素进队,这就是“假溢出”。

为了解决这个问题,可以将数组弄成一个环,让rear和front沿着环走,这样就不会出现两者来到数组尽头无法继续往下走的情况,这就是循环队列。

循环队列如图所示:

(1) 由空队进队两个元素,此时front指向0,rear指向2
(2) 进队4个元素,出队3个元素,此时front指向3,rear指向6
(3) 进队2个元素,出队4个元素,此时front指向7,rear指向0


要使指针沿着环走,就要使 front=(front+1)%maxSize     rear=(rear+1)%maxSize    (maxSize是数组长度)
例如数组长度为8,若front的初值为0,则根据这个公式,front的取值为0,1,2,3,4,5,6,7,0,1,.......即以0-7为周期的无限循环数
1) 队空:rear==front

2) 队满:(rear+1)%maxSize==front

示意图如下:


元素入队时,先移动指针,后存入元素;元素出队时,也是先移动指针再取出元素。(可以有不同的次序,我习惯于这种。)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

完整代码如下(ps:代码是循环队列)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define maxSize 100

int a[maxSize] = { 0 };
int count = 0;
int InData()
{
	int i = 0;
	printf("请输入入队数据,按回车键停止!\n");
	while (1)
	{
		scanf_s("%d", &a[i]);
		i++;
		count++;
		char c = getchar();
		if (c == '\n')
			break;
	}
	return count;
}



/**************顺序队定义*************/
typedef struct
{
	int data[maxSize];
	int front;     //队首指针
	int rear;      //队尾指针
}SqQueue;

SqQueue qu;
/*********************初始化队*****************/
void initQueue()
{
	qu.front = qu.rear = 0;
}

/********************判断队空****************/
int isEmpty()
{
	if (qu.front == qu.rear)
		return 1;     //不论队首和队尾指针指向数组中哪个位置,只要两者重合,即为队空
	else
		return 0;
}

/**********************入队,循环队列*********************/
void enQueue()
{
	if ((qu.rear + 1) % maxSize == qu.front)  //判断是否队满
		return 0;
	printf("入队数据顺序为:");
	for (int i = 0; i < count; i++)          //入队先移动队尾指针
	{
		qu.rear = (qu.rear + 1) % maxSize;   //若队未满,则先移动指针
		qu.data[qu.rear] = a[i];
		printf("%d  ", qu.data[qu.rear]);
	}
	return qu.rear;
}

int b[maxSize] = { 0 };  //存放出队的数据的
/**************************出队,循环队列*********************/
int deQueue()
{
	if (qu.front == qu.rear)//若队空,则不能出队
		return 0;
	printf("\n出队数据顺序为:");
	for (int i = 0; i < count; i++)
	{
		qu.front = (qu.front + 1) % maxSize;
		b[i] = qu.data[qu.front];
		printf("%d  ", b[i]);
	}
	return qu.front;
}


void main()
{
	InData();
	initQueue();
	isEmpty();
	enQueue();
	deQueue();
	system("pause");
}

从服装打版到激光切割:二维异形件排版算法在实际生产中的避坑指南 本文深入探讨二维异形件排版算法在服装、家具等行业的实际应用,对比NFP和重叠移除两种核心策略的优缺点,并提供算法落地的五大实战陷阱与解决方案。通过案例分析和技术要点解析,帮助生产管理者提升材料利用率5%-15%,优化生产效率。 阅读详情

相关推荐

量子密钥分发系统设计与实现(一):系统基本架构讨论

本文主要对量子密钥分发系统中的基础架构和基于系统的量子密钥协商过程进行了初步讨论,为后期系列文章进行铺垫。

量子领域相关话题 3897

【数据结构】栈与队列

重点:指针问题,判满问题,堆栈问题,矩阵压缩公式。

Bonstoppo 672

Python 中调用 R 语言的教程(包含编码问题解决办法)

rpy2 是一个 Python 库,允许在 Python 中直接运行 R 代码并实现数据转换。安装需确保 Python 和 R 环境正确配置,Windows 用户需注意编码问题(GBK 错误可通过控制面板调整区域设置解决)。基本用法包括执行 R 代码、传递数据(支持 Python 与 R 数据类型自动转换)以及调用 R 包函数。通过 robjects.r() 执行 R 代码,使用 pandas2ri 转换器处理 DataFrame 数据交换,并支持像导入 Python 模块一样加载 R 包(如 import

zygalaxy的博客 995

循环队列出队,队首指针为何前移

首先队列是先进先出的,对头指针为front,尾为rear。 删除就等于出队吧,删除的话就是把后面的元素前移一位,覆盖掉要删除的元素

minihuabei的博客 1023

超实用!VS Code配置C/C++开发环境全攻略

本文提供了一份详细的VS Code配置C/C++开发环境全攻略。从MinGW-w64编译器的选择与安装,到VS Code核心扩展的配置,再到tasks.json构建任务与launch.json调试环境的设置,手把手指导初学者完成从环境搭建到高效开发与调试的全过程,帮助开发者快速上手C/C++项目。

weixin_28829479的博客 185

绕开华为通道,获取解锁码解锁BootLoader

刷机有风险,操作需谨慎,如果因为各种因素导致手机变砖无法开机,本教程概不负责,望悉知 前言 这篇文章的大多内容是根据我自己找的一篇文章《绕开华为通道,获取解锁码解锁BootLoader》来编写的,里面的大部分内容是文章的原内容。下面的都是我参考文章中做了一些小部分的修改,增加了我华为P8手机的一些操作,下面开始讲述我的解锁过程。 因为华为官方在2018年的七八月份吧,关闭了解锁码的申请通道,这...

Martin.Mu `s Special Column 5万+

实验二栈和队列

实验二 栈和队列 一、实验目的和要求 1、理解栈的存储结构及基本操作实现。 2、掌握应用栈解决问题的方法。 3、掌握队列的存储结构及基本操作实现,并能在相应的应用问题中正确选用它们。 二、实验仪器和设备 微型计算机 三、实验内容与过程 1、验证性实验:实现顺序栈的基本操作 实验内容:编写一个程序sqstack.cpp (或.c),实现顺序栈的各种基本运算(假设栈中元素类型SElemType为char),并在此基础上设计一个程序exp3-1.cpp (或.c)完成以下功能。 (1) 初..

qq_57611608的博客 3977

从‘平行’到‘鱼骨’:手把手拆解AlGaN/GaN HEMT多栅指结构的布局优化实战

本文深入探讨了AlGaN/GaN HEMT多栅指结构的布局优化,从传统的平行栅结构到创新的鱼骨栅结构,详细解析了如何通过优化信号路径和热管理提升功率器件的性能。文章结合实测数据和EDA工具,展示了鱼骨栅结构在相位一致性、热阻和版图利用率方面的显著改进,为射频功率放大器设计提供了实用指导。

weixin_27061475的博客 442

队列和栈的两种存储方式

队列和栈

学习记录,厚积薄发 1390

SAP 成本分摊逻辑与案例(含具体数据)

摘要: SAP成本分摊通过**分配(Allocation)与分摊(Assessment)**两种方式,将间接成本中心费用按预设规则(如人数、工时、比例等)结转至直接成本对象。分配保留原始成本要素(如电费、工资),适用于需明细追踪的场景;分摊则打包为次级成本要素(如管理费用),简化核算。实操案例涵盖行政费用分配(按人数)、水电车间分摊(按工时)、机修作业分摊(作业成本法)及内部订单结算,系统通过KSV1/KSU1配置循环规则,KSV5/KSU5执行结转。关键点在于选择匹配业务的分摊基础,合理配置次级成本要素,

金牌架构师 552

SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行

本文是ABAP开发入门指南,详细介绍如何创建并运行第一个"Hello World"程序。主要内容包括:通过SE38事务码进入ABAP编辑器;创建以Z/Y开头的程序并保存为本地对象;编写简单的WRITE输出语句;完成语法检查、激活和执行流程;以及初步体验调试功能。文章特别强调ABAP开发的规范要求,如程序命名规则、激活与保存的区别等,并提供了详细的步骤说明和常见问题提示,帮助零基础开发者快速上手ABAP编程。

baidu_35680696的博客 480

关于入栈、出栈指针和数据操作顺序的疑问解答

(为什么入栈时,要先修改指针,然后插入数据;出栈时刚好相反?) 堆栈是一个抽象数据类型,规定的两项必备的基本操作分别为入栈和出栈。这个抽象数据类型并没规定入栈与出栈具体要怎么实现。你问的问题已经在实现这一层面上,所以按照堆栈这种抽象数据类型的规定看,“先修改指针,然后插入数据,出栈时刚好相反”并不是必须的,这取决于你的操作的具体实现。 如果你的堆栈的实现是往上长的(就是说往顶的方向长,其实质是你的栈底是定死的不能动,入栈的东西只能不断往上叠,这就像你在书桌上放书一样,桌底是定死的,所以你的书只能一本一本地往

weixin_45789365的博客 1791

YOLOv8改进策略【损失函数篇】| 替换Powerful-IoU(PIoU),增强对中等质量锚框的关注力,引导锚框更直接、高效地回归

现有基于IoU的损失函数存在不合理的惩罚因子,导致锚框在回归过程中出现面积扩大的问题,使得回归效率降低、收敛速度变慢。同时,这些损失函数在反映锚框与目标框之间的差异、考虑目标框大小以及某些情况下的性能表现等方面存在局限性。在目标检测任务中,边界框回归的损失函数对检测性能至关重要。Powerful-IoU(PIoU)及其升级版PIoU v2正是为解决现有损失函数存在的问题而设计的。本文利用PIoU改进YOLOv8的损失函数,提高模型精度。

Limiiiing的博客 673

【嵌入式软件-数据结构与算法】01-数据结构

摘录于老师的教学课程~~(*๓´╰╯`๓)~~内含链表、队列、栈、循环队列等详细介绍~~

零碎小杂铺 1420

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C语言栈和队列的实现

详细讲解栈与队列的定义和特性,用C语言分别实现顺序栈、链栈、顺序(循环)队列、链队列,已经顺序存储与链式存储的区别

k666499436的博客 6036

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构之队列(顺序队和链队)(C语言附完整代码)

队列简称队,它是一种操作受限的线性表,其限制为仅允许在表的一端进行插入操作,而在表的另一端进行删除操作。把进行插入的一端称为队尾,把进行删除的一端称为队头或队首。向队列中插入新元素称为进队或入队,从队列中删除元素称为出队或离队。由于队列的插入和删除操作分别是在各自的一端进行的,每个元素必然按照进入的次序出队,所以又把队列称为先进先出表。采用顺序存储结构的队列称为顺序队声明顺序队//存放队中元素 int front , rear;//队首和队尾指针 } SqQueue;采用链式存储结构的队列称为链队。

m0_62795460的博客 9324

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言实现数据结构——顺序队和链队

C语言实现数据结构之队列:顺序队和链队。

chfens的博客 1575

[数据结构] 二、栈和队列

目录 一、栈和队列的思维导图 二、栈和队列的基本概念 1、栈的基本概念 2、队列的基本概念 三、栈的结构体定义和基本操作 1、顺序栈 2、链栈 四、队列的结构体定义和基本操作 1、顺序队 2、链队 一、栈和队列的思维导图 栈(Stack)是一个先进后出(First InLast out,FILO)的线性表,它要求只在一端进行删除和插入操作。 队列(queue)...

Yingjieweb 的技术博客 1109

数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)

队列和栈一样,也是限定只能在表的“端点”进行的线性表。队列在插入的时候,只能在表尾进行插入,在删除的时候,只能在表头进行删除。(先进先出),表尾即队尾,表头即队头。栈和队列是线性表的子集(是插入和删除位置受限的线性表)由于队列的操作具有先进先出的特性,使得队列成为程序设计中解决类似排队问题的有用工具。队列的逻辑结构与同线性表相同,仍为一对一关系。队列的存储结构有顺序队和链队,以循环顺序队列更常见。关键是掌握入队和出队操作,具体实现依顺序队或链队的不同而不同。

weixin_74209413的博客 1466

C语言模拟银行排队叫号(顺序队)

本文主要是通过模拟银行排队叫号来对队列的顺序存储结构进行练习。

墨城烟柳ベ旧人殇的博客 5290

数据结构C(5)——栈和队列的定义和特点、栈的定义和特点、队列的定义和特点、栈的表示和操作的实现、链栈的表示和实现、栈与递归、队列的表示和操作的实现

一、栈和队列的定义和特点 栈和队列是两种常用的、重要的数据结构 栈和队列是限定插入和删除只能在表的“端点”进行的线性表 栈和队列是线性表的子集(是插入和删除位置受限的线性表) 栈——先进后出、后进先出 队列——先进先出 二、栈的定义和特点 栈(stack)是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表 又称为后进先出的线性表,简称LIFO结构 表尾(即an端)称为栈顶Top;表头(即a1端)称为栈底Base 插入元素到栈顶(即表尾)的操作,称为入栈 从栈顶(即表尾)删

Allure_07的博客 7837

c语言栈和队列实验报告,数据结构与算法实验报告栈

数据结构与算法实验报告栈Tag内容描述:1、实验二 栈和队列实现四则运算 一、实验目的及要求: 1、掌握栈和队列的基本操作:建立、插入、删除、查找、合并 2、掌握用栈和队列的储存 3、熟悉C语言上机编程环境 4、掌握编译、调试程序的方法 二、实验内容: 采用栈进行表达式的求值,表达式求值是程序设计语言编译中的一个最基本问题。它的实现是栈应用的又一个典型例子,本报告使用的是“算符优先法”求表达式的值...

weixin_42500616的博客 2049

停车场管理系统 - 栈和队列的应用(C语言)

为了深入掌握栈和队列数据结构的应用和算法设计。设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出,用栈模拟停车场,用队列模拟车场外的便道,按照从键盘获取的输入数据序列进行模拟管理。 C语言;数据结构与算法;停车场管理系统;栈;队列;结构体

Mzyh的博客 3135

数据结构与算法——栈和队列定义和特点

栈(stack)是一个特殊的线性表是限定仅在一端(通常是尾部)运行插入和删除操作的线性表又称为先进先出的线性表简称 LIFO 结构 9(Last In First out)

weixin_68773927的博客 4364

NO.3数据结构栈和队列|顺序栈|共享栈|链栈|顺序队|循环队列|链队|双端队列|括号匹配|中缀表达式转后缀|后缀表达式求值

栈与队列数据结构总结 栈是一种后进先出(LIFO)的线性表,只允许在栈顶进行插入和删除操作。顺序栈采用数组实现,需要判满/空;链栈采用链表实现,更灵活。共享栈可以有效利用存储空间。n个元素进栈的不同出栈序列数满足卡特兰函数。 队列是一种先进先出(FIFO)的线性表,在队尾插入,队头删除。顺序队列存在假溢出问题,循环队列通过取模运算解决。链队列使用带队头队尾指针的链表实现。判断循环队列空/满有多种方法,如牺牲一个单元、使用size变量或tag标记。 两种数据结构都有顺序和链式两种存储方式,基本操作包括初始化、

ChoSeitaku的博客 935

栈和队列详解

栈和队列也属于线性表,但是它们存取顺序有一定的顺序,本篇对其做重点讲解。

weixin_61661271的博客 2629
上一篇: 数据结构---栈和队列之链栈(C语言)
下一篇: 数据结构---栈和队列之链队(C语言)
小陆同学LLR
博客等级 码龄10年 213粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值