当前位置: 首页 > news >正文

顺序队列----数据结构

队列的概念

队列,符合先进先出特点的一种数据结构,是一种特殊的线性表,但它不像线性表一样可以任意插入和删除操作,而是只允许在表的一端插入,也就是在队列的尾部进行插入;只允许在表的另一端进行删除,也就是在队列的头部进行删除。

以下的实现是顺序队列(存储空间在内存上是连续的队列)

队列的实现

队列的结构定义

#define MAX_SIZE 20            //队列的最大容量
typedef int DateElem;   typedef struct _Queue
{DateElem date[MAX_SIZE];int head;				//头指针int tail;				//尾指针
}squeue;

队列的初始化

void InitQueue(squeue* sq)
{if (!sq) return;sq->head = 0;sq->tail = 0;
}

销毁(清空)队列

和队列的初始化有点类似哈哈。

bool DestoryQueue(squeue* sq)
{if (!sq) return false;sq->head = 0;sq->tail = 0;return true;
}

判满

bool IsFull(squeue* sq)
{if(!sq) return false;    //防御性编程if (sq->tail >= MAX_SIZE ) //每入队一个元素,sq->tail++,入队了MAX_SIZE个元素刚好sq->tail等于MAX_SIZE{return true;}else{return false;}
}

判空

可以从 队列的初始状态(空队列)入队后再出队 中找到判空的条件。

bool IsEmpty(squeue* sq)
{if (!sq) return false;if (sq->head == sq->tail) //两个指针之间没有元素{return true;}else{return false;}
}

入队

bool EnterQueue(squeue* sq, DateElem e)
{if (IsFull(sq)){cout << "无法插入元素"<<e<<",队列已满。" << endl;return false;}sq->date[sq->tail ] = e;  //尾部插入sq->tail++;               //尾指针指向下一块未被使用区域 return true;
}

出队

出队的方式有两种,一种是乾坤大挪移,每出队一个元素都要将后面所有的元素往前挪,十分浪费时间。另一种是舍弃空间来达到快速出队元素。

第一种

bool PopQueue(squeue* sq, DateElem* date)
{if (!sq || IsEmpty(sq)) return false;*date = sq->date[sq->head];         //返回出队的元素for (int i = sq->head + 1; i < sq->tail; i++){sq->date[i - 1] = sq->date[i]; //从第二个结点开始,将第二个结点赋值给第一个结点……}sq->tail--;    //别忘记return true;
}

第二种

bool PopQueue2(squeue* sq,DateElem *date)
{if (!sq || IsEmpty(sq)) return false;//不是无限制的出队if (sq->head >= MAX_SIZE) return false;*date = sq->date[sq->head];sq->head++;return true;
}

本来头指针一直指向下标为 0 的地方,但是这种出队方式会导致头指针一直向后移动,出现“假溢出”,明明队列还有空间存储,可是却无法插入元素了。如下图:

造成了空间的浪费,不过在比赛时为了通过题目,这点空间浪费无所谓,使用顺序队列非常容易构建。

 打印队列

和链表的打印一样。

bool PrintQueue(squeue* sq)
{if (!sq) return false;for (int i = sq->head; i < sq->tail; i++){printf("%d ", sq->date[i]);}return true;
}

获取队首元素

int GetHeadElem(squeue* sq)
{if (!sq || IsEmpty(sq)) return 0; //指针存在 或者 队列不为空return sq->date[sq->head];        //在队头不出队的清况下,返回队首元素
}

获取队列长度

int GetLength(squeue* sq)
{if (!sq) return 0;return sq->tail - sq->head; //最开始为空队列sq->tail - sq->head 为 0 ,依次类推得到长度
}

主函数

我已经写好了测试的方法,可以尽情调试看看代码的正确性。

int main(void)
{squeue* sq = new squeue;DateElem* s = new DateElem;InitQueue(sq);DateElem e = 0;int choose = -1;while (choose != 0){cout << "1.入队" << endl<< "2.出队" << endl<< "3.打印队列" << endl<< "4.获取队首元素" << endl<< "5.获取队列长度" << endl<< "6.销毁队列" << endl<< "0.退出" << endl;cin >> choose;switch (choose){case 1:cout << "请输入要入队的元素:";cin >> e;if (EnterQueue(sq, e)){cout << "入队成功" << endl;}else{cout << "入队失败" << endl;}break;case 2:if (PopQueue(sq, s)){cout << "出队的元素是:" << *s << endl;}else{cout << "出队失败" << endl;}break;case 3:cout << "队列中的元素是:";PrintQueue(sq);cout << endl;break;case 4:cout << "队首元素是:" << GetHeadElem(sq) << endl;break;case 5:cout << "队列的长度是:" << GetLength(sq) << endl;break;case 6:if (DestoryQueue(sq)){cout << "队列已销毁" << endl;}else{cout << "队列不存在" << endl;}break;case 0:cout << "退出成功" << endl;break;default:cout << "输入非法" << endl;break;}}return 0;
}

好了再见!

相关文章:

顺序队列----数据结构

队列的概念 队列&#xff0c;符合先进先出特点的一种数据结构&#xff0c;是一种特殊的线性表&#xff0c;但它不像线性表一样可以任意插入和删除操作&#xff0c;而是只允许在表的一端插入&#xff0c;也就是在队列的尾部进行插入&#xff1b;只允许在表的另一端进行删除&…...

【Python学习笔记】字符串格式化

1. printf 风格 这种格式化语法 和 传统的C语言printf函数 一样 。 salary input(请输入薪资&#xff1a;)# 计算出缴税额&#xff0c;存入变量tax tax int(salary) *25/100 # 计算出税后工资&#xff0c;存入变量aftertax aftertax int(salary) *75/100 print(税前薪资&…...

RIP,EIGRP,OSPF区别

1. 动态路由协议的作用是什么&#xff1f; 2. 路由协议都有哪些种类&#xff1f; 3. 如何判断路由协议的优劣&#xff1f; -- RIP&#xff0c;EIGRP&#xff0c;OSPF - 动态路由协议 -- 路由协议 - 路由器上的软件 -- 帮助路由器彼此之间同步路由表 -- 相互的传递…...

驱动day2作业

编写应用程序控制三盏灯亮灭 head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_LED1_MODER 0x50006000 #define PHY_LED2_MODER 0x50007000 #define PHY_LED1_ODR 0x50006014 #define PHY_LED2_ODR 0x50007014 #define PHY_RCC 0x50000A28#endif demo1.c #includ…...

MySQL基本操作之创建数据表

设计表: 学生表(Student): 学号(StudentID)- 主键,用于唯一标识每个学生姓名(Name)性别(Gender)年龄(Age)出生日期(BirthDate)地址(Address)电话(Phone)邮箱(Email)课程表(Course): 课程号(CourseID)- 主键,用于唯一标识每门课程课程名(CourseNam…...

rk平台android12修改dp和喇叭同时输出声音

客户的rk3588主板android12系统&#xff0c;要求接上type-c 进行dp输出显示以后&#xff0c;dp端和主板端都有声音。rk原有系统默认是接上dp显示以后&#xff0c;主板的喇叭声音会被切掉&#xff0c;导致没有声音。要让喇叭和dp同时输出声音需要做如下修改&#xff1a; --- a/…...

经典网络模型

Alexnet VGG VGG的启示 VGGNet采用了多次堆叠3x3的卷积核&#xff0c;这样做的目的是减少参数的数量。 例如&#xff0c;2个3x3的卷积核效果相当于1个5x5的卷积核效果&#xff0c;因为它们的感受野&#xff08;输入图像上映射区域的大小&#xff09;相同。但2个3x3卷积核的参数…...

SystemVerilog Assertions应用指南 Chapter1.29“ disable iff构造

在某些设计情况中,如果一些条件为真,则我们不想执行检验。换句话说,这就像是一个异步的复位,使得检验在当前时刻不工作。SVA提供了关键词“ disable iff来实现这种检验器的异步复位。“ disable iff”的基本语法如下。 disable iff (expression) <property definition> …...

C++设计模式之MVC

MVC&#xff08;Model-View-Controller&#xff09;是一种经典的软件架构模式&#xff0c;用于组织和分离应用程序的不同部分&#xff0c;以提高代码的可维护性、可扩展性和重用性。MVC模式将应用程序分为三个主要组成部分&#xff1a; Model&#xff08;模型&#xff09;&…...

Windows 下Tomcat监测重启

echo off setlocal enabledelayedexpansion rem 链接 set URL"localhost:8080/XXX.jsp" rem tomcat目录 set TOMCAT_HOMED:\apache-tomcat-7.0.100-windows-x64\apache-tomcat-7.0.100 rem 关闭tomcat命令的路径 set CLOSE_CMD%TOMCAT_HOME%\bin\shutdown.bat rem 启…...

数据库管理-第112期 Oracle Exadata 03-网络与ILOM(20231020)

数据库管理-第112期 Oracle Exadata 03-网络与ILOM&#xff08;202301020&#xff09; 在Exadata中&#xff0c;除了对外网络以外&#xff0c;其余网络都是服务于一体机内部各组件的网络&#xff0c;本期对这些网络的具体情况和硬件管理相关做一个讲解。 1 网络分类 1.1 生产…...

Kubeadm部署k8s集群 kuboard

目录 主机准备 主机配置 修改主机名&#xff08;三个节点分别执行&#xff09; 配置hosts&#xff08;所有节点&#xff09; 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包&#xff08;所有节点&#xff09; 系统参数设置(所有节点) 时间同步(所有节点) 配…...

虚拟机如何联网【NAT】

查看VMWARE的IP地址 #进入root用户 su -#更改虚拟网卡设置界面 vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改ONBOOT为yes BOOTPROTO为static IPADDR为前面的网段 192.168.211.xx (xx为自己设置的&#xff0c;可以随意设置&#xff0c;前面的为前面查看的IP地址的前…...

机器学习,神经网络中,自注意力跟卷积神经网络之间有什么样的差异或者关联?

如图 6.38a 所示&#xff0c;如果用自注意力来处理一张图像&#xff0c;假设红色框内的“1”是要考虑的像素&#xff0c;它会产生查询&#xff0c;其他像素产生 图 6.37 使用自注意力处理图像 键。在做内积的时候&#xff0c;考虑的不是一个小的范围&#xff0c;而是整张图像的…...

这件事,准备考PMP的都必须知道

大家好&#xff0c;我是老原。 新的一月&#xff0c;新的困惑。最近接到的咨询很多&#xff0c;但的确出现了差异化的特质。 以前的粉丝朋友上来就问&#xff0c;我现在是项目经理&#xff0c;主要负责产品研发&#xff0c;我是考PMP还是NPDP好&#xff1f; 现在的粉丝朋友会…...

elasticsearch常用命令

Elasticsearch概念 ElasticsearchmysqlIndex(索引)数据库Type(类型)表Documents(文档)行Fields列 常用命令 索引 # 索引初始化&#xff0c;number_of_shards:分片数&#xff0c;不可修改&#xff1b;number_of_replicas:副本数&#xff0c;可修改 PUT lagou {"settings…...

2000-2021年上市公司MA并购溢价计算数据(含原始数据+Stata代码)

2000-2021年上市公司M&A并购溢价计算&#xff08;原始数据Stata代码&#xff09; 1、时间&#xff1a;2000-2021年 2、范围&#xff1a;沪深A股上市公司 3、指标&#xff1a; 原始数据指标&#xff1a;事件ID、公司ID、证券代码、业务编码、上市公司交易地位编码、首次公…...

移动端1px-从基本原理到开源解决方案介绍

1px 不够准确&#xff0c;应该说成 1 物理像素 为什么有 1px 这个问题&#xff1f;实现 1px 有哪些方法&#xff1f;这些方法分别有哪些优缺点&#xff1f;开源项目中使用的哪些解决方案&#xff1f;如何在项目中处理 1px 的相关问题&#xff1f; 基本概念 首先&#xff0c;我们…...

Linux——shell外壳程序

shell外壳程序 1. 什么是shell外壳程序 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心 “ &#xff0c;但我们一般用户&#xff0c;不能直接使用核心。 而是通过核心的“外壳”程序&#xff0c;也就是所谓的shell。 shell是所有外壳程序的统称 平时程序员…...

攻防世界web篇-Training-WWW-Robots

直接点击给出的地址&#xff0c;然后会转到另一个网页界面&#xff0c;在这个界面&#xff0c;已经给出了提示&#xff0c;robots.txt 在浏览器中&#xff0c;直接在地址的后面加上robots.txt&#xff0c;会进到下面这个界面 因为对php语言一窍不通&#xff0c;所以这里纯粹就…...

Docker是一个流行的容器化平台,用于构建、部署和运行应用程序。

文章目录 Web应用程序数据库服务器微服务应用开发环境持续集成和持续部署 (CI/CD)应用程序依赖项云原生应用程序研究和教育 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;…...

如何压缩ppt文件的大小?

如何压缩ppt文件的大小&#xff1f;要知道现在很多课件都是使用ppt文件&#xff0c;那么就导致ppt文件过大&#xff0c;我们很多时候电脑的存储空间就不够了。为了能够更好的存储这些ppt文件&#xff0c;我们通常会选择压缩ppt文件。怎么压缩ppt文件更快更好&#xff0c;没有损…...

8个视频剪辑素材网站,免费下载

找视频剪辑素材就上这8个网站&#xff0c;免费下载&#xff0c;可商用&#xff0c;赶紧收藏起来~ 免费视频素材 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff0c;高清视频素材也很多…...

常用的二十种设计模式(上)-C++

C中常用的设计模式有很多&#xff0c;设计模式是解决常见问题的经过验证的最佳实践。以下是一些常用的设计模式&#xff1a; 单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。工厂模式&#xff08;Factory&am…...

JS中var和let和const的区别

在我很早之前&#xff0c;我还在用着var&#xff0c;直到接触到了let与const&#xff0c;我才知道var造成的影响很多&#xff0c;我果断的抛弃了var&#xff0c;哈哈 让我为大家介绍一下它们的区别吧&#xff01; 1.块级作用域 块作用域由 { }包括&#xff0c;let和const具有…...

如何利用IP定位技术进行反欺诈?

网络欺诈风险是指在互联网和数字领域中&#xff0c;存在各种类型的欺诈活动&#xff0c;旨在欺骗个人、组织或系统以获得非法获益。以下是一些常见的网络欺诈风险类型&#xff1a; 身份盗用&#xff1a;这是一种欺诈行为&#xff0c;涉及盗取他人的个人身份信息&#xff0c;如姓…...

wireshark抓包本地IDEA xml格式报文教程以及postman调用接口

1、选择 2、筛选...

MySQL学习(六)——视图和触发器

文章目录 1. 视图1.1 视图语法1.2 检查选项1.3 视图的更新1.4 视图的作用 2. 触发器2.1 介绍2.2 语法介绍2.3 触发器示例2.3.1 插入数据触发器2.3.2 修改数据触发器2.3.3 删除数据触发器 1. 视图 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据…...

那些你面试必须知道的ES6知识点

目录 1、var、let、const的区别2、作用域考题3、合并两个对象4、箭头函数和普通函数的区别5、Promise有几种状态6、find和filter的区别7、some和every的区别 1、var、let、const的区别 区别一&#xff1a; var有变量提升&#xff0c;而let和const没有 <script>console.l…...

AD9371 系列快速入口

参考资料&#xff1a; AD9371 JESD204 Interface Framework Generic JESD204B block designs AD9371 & AD9375 Prototyping Platform User Guide ADI™ Reference Designs HDL User Guide 相关设备 &#xff1a; ZCU106ADRV9371CPRO33-30.726 dB 衰减 AD9371ZCU102 移植到…...