链式队列----数据结构

队列的基本概念

队列是一种操作受限的线性表(先进先出),只允许在队尾插入,队头删除。

例如去银行办理业务,肯定是先来的先出去,后来的人排在后方,只有第一个人业务办理完了,才会有一个人出队列。

队列的实现

结点和指针的定义

#define MAX_SIZE 50typedef int DateElem;         //队列中的元素类型
typedef struct _QueueNode
{DateElem date;struct _QueueNode* next;  //和单链表结点的定义一样
}QueueNode; typedef QueueNode*  QueuePtr;      //可以用QueuePtr创建一个指向结点的指针typedef struct LinkQueue           //定义的是队列头、尾指针
{int length;    //存储队列的长度,因为要频繁获取长度QueuePtr head; //指向第一个结点,队头指针QueuePtr tail; //指向最后一个结点,队尾指针
}Queue;

初始化

//初始化队列
bool InitQueue(Queue* sq)
{if (!sq) return false; sq->length = 0;sq->head = NULL;     //置为空,最开始为空队列sq->tail = NULL;return true;
}

判断是否为空

bool IsEmpty(Queue* sq)
{if (!sq) return false;//头指针没有指向任何一个结点if (sq->head == NULL) //不能用 sq->head == sq->tail 来判断,因为队列只有一个元素时,头尾指针指向同一个结点,但是可以用 sq->head == sq->tail = NULL,意思是三个都相等{return true;}return false;
}

判断是否满了

bool IsFull(Queue* sq)
{if (!sq) return false;if (sq->length >= MAX_SIZE) //长度最开始为0,插入一个,长度 +1{return true;}return false;
}

插入(入队)

bool EnterQueue(Queue* sq, DateElem *e)
{if (!sq) return false;   if (IsFull(sq)) return false; //队列满了,无法继续插入QueueNode *p = new QueueNode;p->date = *e;p->next = NULL;               //因为是最后一个结点,没有直接后继if (IsEmpty(sq)) //空队列{sq->head = p;sq->tail = p;}else{//此时head指向第一个结点,tail指向最后一个结点sq->tail->next = p;sq->tail = p;          //更新tail指针}sq->length++;              //别忘记了return true;
}

删除(出队)

bool PopQueue(Queue* sq,DateElem *date)
{if (!sq || IsEmpty(sq)) return false;if (!date) return false;//此时head指向第一个结点,tail指向最后一个结点QueueNode* p = sq->head;sq->head = p->next;         //head指向第二个结点*date = p->date;            //返回删除的值delete p;//如果队列只有一个结点,而恰好刚刚删除了,也就是空队列if (IsEmpty(sq)){sq->head = NULL; //head已经为空,写一下更整齐(可以不用写)sq->tail = NULL;}sq->length--;return true;
}

打印队列

bool Print(Queue* sq)  //和链表的打印一样
{if (!sq ) return false; if (IsEmpty(sq)){cout << "队列为空" << endl;}QueueNode* p = sq->head;cout << "队列中的元素:";while (p != NULL){printf("%d ", p->date);p = p->next;}cout << endl;return true;
}

清空队列

//清空队列
bool ClearQueue(Queue* sq)
{if (!sq || IsEmpty(sq)) return false; QueueNode* p = sq->head,*q = NULL;while (p != NULL) {q = p->next;    delete p;            p = q;}sq->length = 0;sq->head = NULL;sq->tail = NULL;return true;
}

获取队头元素

bool GetHead(Queue* sq, DateElem* date)
{if (!date || !sq || IsEmpty(sq) )return false; *date = sq->head->date;   //指针返回队首元素return true;}

主函数代码

可以在主函数中测试一下刚刚实现的功能,还有一些功能可以自己去实现,比如获取队列长度。

int main(void)
{Queue* sq = new Queue ;DateElem* s = new DateElem;//1.初始化队列InitQueue(sq);for (int i = 1; i <= 7; i++){if (EnterQueue(sq, &i)){cout << "入队成功" << endl;}else{cout << "入队失败," << i << "未插入" << endl;}}Print(sq);for (int i = 0; i < 8; i++){if (PopQueue(sq, s)){cout << "出队的元素是" << *s << endl;}else{cout << "出队失败" << endl;}Print(sq);}ClearQueue(sq);Print(sq);return 0;
}

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

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

相关文章

使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具&#xff0c;可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

策略模式——多重if-else解决方案

概念 大量的 if 判断操作&#xff0c;逻辑比较复杂&#xff0c;并且处理起来相对麻烦。可以采用策略模式来优化分支代码。 策略模式 &#x1f4a4;&#xff1a;是一种行为设计模式&#xff0c;它允许你在运行时根据不同情况选择不同的算法或行为。 设计模式 &#x1f90c;&…

solidworks 2024新功能之--保存为低版本 硕迪科技

大家期盼已久的SOLIDWORKS保存低版本文件功能来了&#xff0c;从SOLIDWORKS 2024 开始&#xff0c;您可以将在最新版本的SOLIDWORKS 中创建的SOLIDWORKS零件、装配体和工程图另存为SOLIDWORKS 早期版本的全功能文档&#xff08;完成的特征树与相关参数&#xff09;。 将文件另…

跟我一起写个虚拟机 .Net 7(三)- 安装LC-3 模拟器和编译器

LC-3&#xff08;Little Computer 3&#xff09; 是一门教学用的虚拟计算机模型&#xff0c;主要是为了方便学生了解简单化的计算机结构。 主要想学习《计算机系统概论》上的案例&#xff0c;基本都是通过LC-3 模拟器和LC-3编译器来的&#xff0c;所以&#xff0c;把安装的方式…

Kotlin中的逻辑运算符

在Kotlin中&#xff0c;逻辑运算符用于对布尔值进行逻辑运算。Kotlin提供了三个逻辑运算符&#xff1a;与运算&#xff08;&&&#xff09;、或运算&#xff08;||&#xff09;和非运算&#xff08;!&#xff09;。下面对这些逻辑运算符进行详细介绍&#xff0c;并提供示…

第1章 入门

当今&#xff0c;图形编程是基于着色器的&#xff0c;也就是说&#xff0c;有些程序是基于C或Java等标准程序语言编写的&#xff0c;并运行在中央处理器上&#xff08;CPU&#xff09;&#xff1b;另一些是用专用的着色器语言编写的&#xff0c;直接运行在图形处理单元&#xf…

数据库管理-第111期 Oracle Exadata 02-硬件构成(20231017)

数据库管理-第111期 Oracle Exadata 02-硬件构成&#xff08;202301017&#xff09; 新开的坑&#xff0c;感觉一般般&#xff0c;还是坚持写下去吧。 1 过去和Exadata相关的博文 这里集合汇总一下之前写过的和Exadata相关的文章&#xff1a; 数据库管理-第三十七期 我搞挂了…

搜维尔科技:“虚实结合” 体验式人机验证技术,助力通用汽车开启研发新篇章

虚拟现实(VR)技术为制造业带来了巨大的可能性。它使工程师能够以真实世界的比例完整体验他们的设计,就像身临其境一样。通过在VR中模拟制造过程,可以发现并解决许多问题,从而避免在实际生产中投入大量资源后才发现问题。VR模拟使不同团队之间的沟通和协作变得比较直观和高效。这…

SystemVerilog Assertions应用指南 Chapter1.34 :SVA中的多时钟定义

SVA允许序列或者属性使用多个时钟定义来采样独立的信号或者子序列。SVA会自动地同步不同信号或子序列使用的时钟域下面的代码显示了一个序列使用多个时钟的简单例子。 sequence s_multiple_clocks;(posedge clk1) a ##1 (posedge clk2) b; endsequence 序列 s_multiple_clocks…

解决方案|智能制造升级,汽车行业借力法大大电子签进入“快车道”

《“十四五”智能制造发展规划》明确智能制造是制造强国建设的主攻方向&#xff0c;其发展程度直接关乎我国制造业质量水平。发展智能制造对于巩固实体经济根基、建成现代化产业体系、实现新型工业化具有重要作用。 规划明确指出要深入实施智能制造工程&#xff0c;着力提升创…

零基础如何学习自动化测试

现在很多测试人员有些急于求成&#xff0c;没有任何基础想当然的&#xff0c;要在一周内上手自动化测试。 在自动化的过程中时候总有人会犯很低级的问题&#xff0c;有语法问题&#xff0c;有定位问题&#xff0c;而且有人居然连__init__.py 文件名都弄错误&#xff0c;还有将…

【LeetCode】 412. Fizz Buzz

题目链接 文章目录 Python3 【O(n) O(1)】C.emplace_back() 【C 11 之后】 Python3 【O(n) O(1)】 初始版本 class Solution:def fizzBuzz(self, n: int) -> List[str]:ans []for i in range(1, n1):if i % 5 0 and i % 3 0:ans.append("FizzBuzz")elif i % …

AutoSar 学习路线

1 获取Spec 如何获取Autosar SPEC文档&#xff1f; 从官网获取最新的规范文档&#xff0c;网址&#xff1a;https://www.autosar.org/standards。 如果浏览器拦截&#xff0c; 点开高级&#xff0c; 点击继续访问即可。 Autosar 分Classific 和 Adaptive Platform. AUTOSAR分…

Kotlin中的函数定义

在 Kotlin 中&#xff0c;函数是一种重要的语言特性&#xff0c;它用于封装可重复使用的代码块。在本篇博客中&#xff0c;我们将介绍 Kotlin 函数的定义方式&#xff0c;并提供示例代码演示不同类型的函数。 首先&#xff0c;让我们来看一下函数的基本组成部分&#xff1a; …

深度学习(12)之模型训练[训练集、验证集、过拟合、欠拟合]

模型训练[训练集、验证集、过拟合、欠拟合] 在不断补充训练数据集的过程中&#xff0c;发现纯粹增加数据集并不会使得模型效果单向地变好&#xff0c;如果是多目标检测模型的话&#xff0c;常会出现精度变低的现象本文想总结在模型训练时的一些注意事项&#xff0c;比如训练集…

07 创建型模式-单例模式

1.单例模式介绍 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一&#xff0c;此模式保证 某个类在运行期间&#xff0c;只有一个实例对外提供服务&#xff0c;而这个类被称为单例类。 2.使用单例模式要做的两件事 保证一个类只有一个实例…

vue3后台管理系统之pinia及持久化集成使用

安装依赖 pnpm i pinia 在src目录下创建store 创建大仓库 //仓库大仓库 import { createPinia } from pinia //创建大仓库 const pinia createPinia() //对外暴露&#xff1a;入口文件需要安装仓库 export default pinia 全局注册pinia 配置用户仓库pinia管理数据 // 创建用…

linux环境下安装jdk1.8

一.下载linux版jdk安装包 可以在官网上下载&#xff0c;也可以自己找一个 官网地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8 我这里用的是 jdk-8u291-linux-x64.tar.gz 二. 将jdk上传到Linux机器上 我这里用的是MobaXterm,直接拖拽就可以上传…

Python学习-----Day09

一、利用装饰器来获取函数运行的时间、 #导入time模块 import timedef decorated(fn):def inner():#time.time获取函数执行的时间a time.time() # func开始的时间fn()b time.time() # func结束的时间print(f"{fn.__name__}程序运行的总数时间:{b - a}秒")return…

Qt之自定义插件(单控件,Qt设计师中使用)

文章目录 步骤1.选择项目类型2.设置项目名称3.选择合适的构建套件4.根据实际情况选择插件控件列表6.控件类生成&#xff08;默认勾选项&#xff09;7.构建生成项目及生成库位置&#xff08;默认&#xff09;8.库文件拷贝9.重启Qt查看效果 步骤 1.选择项目类型 如图选择‘其他…