C/C++数据结构——队列

个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客

专题分栏:数据结构_仍有未知等待探索的博客-CSDN博客

目录

一、前言

二、队列的基本操作(循环队)

1、循环队的数据类型

2、循环队的名词解释

3、循环队的创建及其初始化

第一种写法  

第二种写法 

4、 判断队满

5、判断队空

6、入队 

7、出队

 8、求长度

三、优势

四、总代码


一、前言

在前面学习了栈的基本知识,知道栈是一种特殊的线性表,其特点是先进后出。

而接下来要学的队列也是一种操作受限的线性表,其特点是先进先出。从队头出队,从队尾入队。

二、队列的基本操作(循环队)

1、循环队的数据类型

在下面的数据类型实现中,存数据的data数组的类型有两种写法。

第一种写法:这样写的话,数组是固定的MAX大小。

//第一种写法
elemtype data[MAX];

第二种写法:这样写的话,可以通过动态内存开辟来给data开辟足够大的空间。 

//第二种写法
elemtype* data;

front和rear的作用是记录对头位置和队尾位置。 

由下图可以清晰的看出:

front:指向第一个元素。

rear:指向最后一个元素的下一个元素。

#define MAX 100
typedef int elemtype;
typedef struct Queue
{//第一种写法//elemtype data[MAX];//elemtype是为了改data的数据类型的时候方便//第二种写法elemtype* data;int front;//队首指针int rear;//队尾指针
}Queue;

2、循环队的名词解释

可能大家一开始都会有疑问,为什么叫做循环队呢?栈用数组进行存储叫做顺序栈,为什么队列用数组存储叫做循环队呢?

假设这是一个队列(并且装满了,一般队列填数组会空一个元素位置)。

如果进行一次出队操作。

 如果要进行一次入队操作的话,现在只有下标为0的地方有空,但是现在rear指向的是最后一个元素的下一个元素。如果rear继续+1,往下走的话,数组会越界,只有让rear指向下标为零的位置上。

3、循环队的创建及其初始化

第一种写法  

  1. 创建循环队和创建栈的操作大体相同,都是用malloc进行开辟空间,如果失败,则返回空。
  2. 在对front指针和rear指针进行初始化的时候,将他们赋值为0就完成了操作。(这里说的指针是泛称,不是真的指针类型,而是有着和指针相同的作用,都用来记录位置
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef int elemtype;
typedef struct Queue
{//第一种写法elemtype data[MAX];//elemtype是为了改data的数据类型的时候方便int front;//队首指针int rear;//队尾指针
}Queue;
Queue* CreateQueue();
int main()
{Queue* Q = CreateQueue();if (Q == NULL)//如果Q开辟失败,结束程序{return 0;}return 0;
}
Queue* CreateQueue()
{Queue* Q = (Queue*)malloc(sizeof(Queue));if (Q == NULL){perror("malloc");//写出错误原因return NULL;//如果Q开辟失败,提前结束}Q->front = 0;Q->rear = 0;return Q;
}

第二种写法 

 大体上和第一种写法没什么区别,唯一不同的是还要在给数组data开辟空间

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef int elemtype;
typedef struct Queue
{//第二种写法elemtype* data;int front;//队首指针int rear;//队尾指针
}Queue;
Queue* CreateQueue();
int main()
{Queue* Q = CreateQueue();if (Q == NULL){return 0;}return 0;
}
Queue* CreateQueue()
{Queue* Q = (Queue*)malloc(sizeof(Queue));if (Q == NULL){perror("malloc_Q");return NULL;}Q->data = (elemtype*)malloc(MAX * sizeof(elemtype));if(Q->data==NULL){perror("malloc_Q->data");return NULL;}Q->front = 0;Q->rear = 0;return Q;
}

4、 判断队满

当Q->front == (Q->rear + 1) % MAX的时候,队满。

Q->front=0,Q->rear=6,将这数据带入上述式子,可得出队满结论,和实际符合。其中主要取循环作用的是取余号(%)

当队满的时候返回1,不满返回0。

int IsFull(Queue* Q)
{if (Q->front == (Q->rear + 1) % MAX)return 1;return 0;
}

5、判断队空

当Q->front == Q->rear的时候,队空。

当对空的时候返回1,否则返回0。

int IsEmpty(Queue* Q)
{if (Q->front == Q->rear)return 1;return 0;
}

6、入队 

注意: Q->rear = (Q->rear + 1) % MAX

int Push(Queue* Q, elemtype x)
{if (IsFull(Q)){return 0;}Q->data[Q->rear] = x;Q->rear = (Q->rear + 1) % MAX;return 1;
}

7、出队

注意: Q->front= (Q->front + 1) % MAX

int Pop(Queue* Q, elemtype* x)
{if (IsEmpty(Q)){return 0;}*x = Q->data[Q->front];Q->front = (Q->front + 1) % MAX;return 1;
}

 8、求长度

注意:有可能Q->rear会在Q->front的左边。

int Queue_length(Queue* Q)
{return (Q->rear - Q->front + MAX) % MAX;
}

三、优势

以上所有的操作的时间复杂度均为O(1) 。

四、总代码

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef int elemtype;
typedef struct Queue
{//第一种写法elemtype data[MAX];//elemtype是为了改data的数据类型的时候方便int front;//队首指针int rear;//队尾指针
}Queue;
Queue* CreateQueue();
int IsFull(Queue* Q);
int IsEmpty(Queue* Q);
int Push(Queue* Q, elemtype x);
int Pop(Queue* Q, elemtype* x);
int Queue_length(Queue* Q);
int main()
{Queue* Q = CreateQueue();if (Q == NULL){return 0;}for (int i = 0; i < 3; i++){int ret = Push(Q, i);if (ret == 0){printf("队满,入队失败\n");}else{printf("入队成功\n");}}int x;int ret = Pop(Q, &x);if (ret == 0){printf("队满,入队失败\n");}else{printf("出队成功\n");}return 0;
}
Queue* CreateQueue()
{Queue* Q = (Queue*)malloc(sizeof(Queue));if (Q == NULL){perror("malloc");return NULL;}Q->front = 0;Q->rear = 0;return Q;
}
int IsFull(Queue* Q)
{if (Q->front == (Q->rear + 1) % MAX)return 1;return 0;
}
int IsEmpty(Queue* Q)
{if (Q->front == Q->rear)return 1;return 0;
}
int Push(Queue* Q, elemtype x)
{if (IsFull(Q)){return 0;}Q->data[Q->rear] = x;Q->rear = (Q->rear + 1) % MAX;return 1;
}
int Pop(Queue* Q, elemtype* x)
{if (IsEmpty(Q)){return 0;}*x = Q->data[Q->front];Q->front = (Q->front + 1) % MAX;return 1;
}
int Queue_length(Queue* Q)
{return (Q->rear - Q->front + MAX) % MAX;
}

谢谢大家的支持!

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

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

相关文章

Windows与Linux服务器互传文件

使用winscp实现图形化拖动的方式互传文件. 1.下载winscp软件并安装&#xff0c;官方地址&#xff1a; https://winscp.net/eng/index.php 2.打开软件&#xff1a; 文件协议选择scp&#xff0c;输入linux服务器的IP和端口号&#xff0c;然后输入你的用户名和密码就可以登陆了。…

基于Java的校园餐厅订餐管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

Linux 进程切换与命令行参数

假设进程1现在要切走了&#xff0c;切入进程2.那进程1就要先保存数据&#xff0c;方便以后恢复&#xff0c; 然后进程2再切走&#xff0c;进程1再把数据还原&#xff1a; 操作系统又分为实时操作系统和分时操作系统。 实时操作系统是是给操作系统一个进程&#xff0c;操作系统…

【漏洞复现】panalog日志审计系统任意用户创建漏洞和后台命令执行

漏洞描述 panalog为北京派网软件有限公司,一款流量分析,日志分析管理的一款软件。存在任意用户创建漏洞和后台命令执行漏洞,可先通过任意用户创建,然后进行后台命令执行,获取服务器权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公…

Vue单文件组件

一、.vue文件 我们使用Vue的单文件组件的时候&#xff0c;一个.vue文件就是一个组件。 例如我们创建一个School组件&#xff1a; 二、组件的结构 我们编写网页代码的时候有HTML结构、CSS样式、JS交互。 组件里也是同样存在这三种结构的&#xff1a; <template><d…

甘特图组件DHTMLX Gantt示例 - 如何有效管理团队工作时间?(二)

如果没有有效的时间管理工具&#xff0c;如工作时间日历&#xff0c;很难想象一个项目如何成功运转。这就是为什么我们的开发团队非常重视项目管理&#xff0c;并提供了多种选择来安排DHTMLX Gantt的工作时间。使用DHTMLX Gantt这个JavaScript库&#xff0c;您可以创建一个强大…

2024SCI经验心得分享---如何在零基础、导师基本放养的情况下---发表自己的第一篇SCI(三区)经验分享篇

本期的经验分享&#xff0c;采访到了我的一位非常非常非常优秀的师妹&#xff0c;师妹于今年6月份投稿&#xff0c;10月份录用&#xff0c;历时四个月录用了自己的第一篇SCI&#xff08;三区&#xff09;的文章图像处理类的&#xff0c;同时师妹也取得了很多其他优秀的荣誉。 众…

软考系列(系统架构师)- 2020年系统架构师软考案例分析考点

试题一 软件架构&#xff08;架构风格、质量属性&#xff09; 【问题1】&#xff08;13分&#xff09; 针对该系统的功能&#xff0c;李工建议采用管道-过滤器&#xff08;pipe and filter)的架构风格&#xff0c;而王工则建议采用仓库&#xff08;reposilory)架构风格。请指出…

mysql图片存取初探

mysql数据库中使用blob存储使用base64加密图片数据 前言 这个方法并不好&#xff0c;因为传输的数据量还是蛮大的&#xff0c;可以存一些诸如头像的小图片&#xff0c;但是如果要存较大的图片会很慢。 不过只是课程作业中简单的功能&#xff0c;这样子简单又快捷&#xff0c;…

CICD 流程学习(五)Jenkins后端工程构建

案例1&#xff1a;数据库服务部署 MySQL部署 #安装MySQL服务 [rootServices ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootServices ~]# yum -y install mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64 ... Complete! [rootServices ~]# #启动…

【JavaEE】网络编程---TCP数据报套接字编程

一、TCP数据报套接字编程 1.1 ServerSocket API ServerSocket 是创建TCP服务端Socket的API ServerSocket 构造方法&#xff1a; ServerSocket 方法&#xff1a; 1.2 Socket API Socket 是客户端Socket&#xff0c;或服务端中接收到客户端建立连接&#xff08;accept方法&…

WordPress SMTP邮件发送插件 Easy WP SMTP

Easy WP SMTP是一款 WordPress 邮件发送插件&#xff0c;WordPress 中经常用到邮件发送&#xff0c;包括新注册用户的邮件通知、找回密码通知、评论回复通知等。因为云服务器默认不启用 SMTP功能&#xff0c;所以需要安装 SMTP插件来解决这个问题。 SMTP 主机&#xff1a;smtp.…

Kurento多对多webrtc会议搭建测试

环境ubuntu18.04 KMS版本6.13.0 多对多通信demo7.0.0 KMS运行起来后&#xff0c;通过运行它的一个个demo&#xff0c;来实现不同的功能&#xff0c;它的demo很多如下&#xff1a; https://github.com/Kurento 里面有一对一&#xff0c;多对多&#xff0c;还有一些特效的demo。…

汽车屏类产品(三):抬头显示Head-Up Display(HUD)

前言 你的下一台车,一定要考虑加装一个HUD。 汽车抬头显示器或汽车抬头显示器(也称为汽车HUD)是任何透明的显示器,它可以在汽车中显示数据,而不需要用户将视线从平时的视角移开。这个名字的由来源于飞行员能够在头部“向上”并向前看的情况下查看信息,而不是向下倾斜查…

ARM可用的可信固件项目简介

安全之安全(security)博客目录导读 目录 一、TrustedFirmware-A (TF-A) 二、MCUboot 三、TrustedFirmware-M (TF-M) 四、TF-RMM 五、OP-TEE 六、Mbed TLS 七、Hafnium 八、Trusted Services 九、Open CI 可信固件为Armv8-A、Armv9-A和Armv8-M提供了安全软件的参考实现…

强化学习代码实战(2) --- 多臂赌博机

目录 前言 1.Python基础 2.Numpy基础 3.多臂赌博机 参考文献 前言 本文内容来自于南京大学郭宪老师在博文视点学院录制的视频&#xff0c;课程仅9元地址&#xff0c;配套书籍为深入浅出强化学习 编程实战 郭宪地址。 1.Python基础 1. print() 可以用该语句查看当前数据的情…

基于食肉植物优化的BP神经网络(分类应用) - 附代码

基于食肉植物优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于食肉植物优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.食肉植物优化BP神经网络3.1 BP神经网络参数设置3.2 食肉植物算法应用 4.测试结果…

MSP430F5529时钟系统配置

1、为什么要进行时钟管理&#xff1f;   时钟系统是一个数字器件的命脉&#xff0c;对于普通的51单片机来说&#xff0c;它的时钟来源只有外部晶振&#xff0c;然后每12个振荡周期完成一个基本操作&#xff0c;所以也叫做12T单片机&#xff0c;但对于当前高级一点的单片机来…

一文解读 SmartX 超融合虚拟化下的网络 I/O 虚拟化技术

随着技术的不断发展&#xff0c;不少行业应用都对网络性能和隔离性有着越来越高的要求。例如&#xff1a; 低延迟&#xff1a;一些期货行业用户选择在期货公司机房托管服务器并自行编写交易程序&#xff0c;以实现对市场波动的快速&#xff08;微秒级&#xff09;反应。尤其是在…

并查集讲解

并查集讲解 一、算法描述二、图示讲解三、代码示例四、例题练习 一、算法描述 并查集算法是一种用于处理不相交集合数据结构的算法。它经常被用来解决网络流问题、图的最小生成树问题等。在这篇博客中&#xff0c;我们将深入理解并查集算法&#xff0c;以及如何在实际编程中使…