队列的表示和操作

news2024/11/25 18:51:39

队列:队列是仅在表尾进行插入操作,在表头进行删除操作的线性表。
表尾即an端,称为队尾,表头即a1端,称为队头。
队列的存储方式:顺序队列和链式队列

队列顺序表示

#define MAXQSIZE 100   //最大队列长度	
	Typedef struct{
		QElemType *base;
		int front;  //头指针
		int rear;   //尾指针

	}SqQueue;																					

设数组大小为MAXQSIZE
则当rear = MAXQSIZE时,发生溢出,这里分为两种情况:真溢出和假溢出。
如下图所示:
在这里插入图片描述
解决假上溢的方法——引入循环队列
实现方法:利用模(mod,取余)运算
插入元素时:Q.base[Q.rear]=x; Q.rear=(Q.rear+1)%MAXQSIZE;

删除元素时:x=Q.base[Q.front]; Q.front=(Q.front+1)%MAXQSIZE;

这里的循环队列指的是循环使用为队列分配的存储空间。

**问题:**在循环队列中,队空和队满的条件都是:front=rear
要怎么区分这两者呢?
解决方案如下:
在这里插入图片描述

循环队列的操作——队列的初始化

Status InitQueue(SqQueue  &Q){
	Q.base=new QElemType[MAXQSIZE]  //分配数组空间
	if(!Q.base)  exit(OVERFLOW);
	Q.front=Q.rear=0;
	return OK;
}

循环队列的操作——队列长度

int QueueLength(SqQueue Q){
	return((Q.rear-Q.front+MAXQSIZE)%MAXQSIZE);
}

循环队列的操作——队列入队

Status EnQueue(SqQueue &Q,QElemType e){
	if((Q.rear+1)%MAXQSIZE==Q.front)  return ERROR;  //队满
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXQSIZE;
	return OK;
}

循环队列的操作——队列出队

Status DeQueue(SqQueue &Q,QElemType &e){
	if(Q.front==Q.rear)  return ERROR;
	e=Q.base[Q.front];   //保存队头元素
	Q.front=(Q.front+1)%MAXQSIZE;
	return OK;
}

循环队列的操作——取队头元素

SElemType GetHead(SqQueue Q){
	if(Q.front!=Q.rear)
		return Q.base[Q.front];   //返回队头指针元素的值,队头指针不变
}

队列的链式表示和实现

类型定义

# define MAXQSIZE 100
typedef struct Qnode{
	QElemType data;
	struct Qnode *next;
}Qnode,*QueuePtr;

链队列初始化

Status InitQueue(LinkQueue &Q){
	Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));  //队头,队尾指针均指向初始化结点。
	if(!Q.front)  exit(OVERFLOW);
	Q.front->next=NULL;
	return OK;
}

销毁链队列

思路:从队头结点开始,依次释放所有结点

Status DestroyQueue(LinkQueue &Q){
	while(Q.front){
		p=Q.front->next;
		free(Q.front);
		Q.front=p;
	}
	return OK;
}

插入元素e

Status EnQueue(LinkQueue &Q,QElemType e){
	p=(QueuePtr)malloc(sizeof(QNode));
	if(!p)  exit(OVERFLOW);
	p->data=e;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
	return OK;
}

链队列出队

Status DeQueue(LinkQueue &Q,QElemType &e){
	if(Q.front==Q.rear)  return ERROR;
	p=Q.front->next;
	e=p->data;
	Q.front->next=p->next;
	if(Q.rear==p) Q.rear=Q.front   //如果头结点下一结点就是尾结点,需要修改尾指针的位置。
	delete p;
	return OK;
}

获取链队列的队头元素

Status GetHead(LinkQueue Q,QElemType &e){
	if(Q.front==Q.rear)  return ERROR;
	e=Q.front->next->data;
}

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

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

相关文章

Vue 1 - 安装、快速上手

文章目录 关于 Vue创建应用 关于 Vue 官网: https://cn.vuejs.org官方文档-快速上手: https://cn.vuejs.org/guide/quick-start.htmlgithub : https://github.com/vuejsVue SFC Playground : https://play.vuejs.org/ 其他 作者 尤雨溪 Evan You 主页 …

如何把caj文件改成PDF格式?分享三个免费的方法!

在学术研究中,我们可能会遇到CAJ文件,这是一种在中国学术界广泛使用的文档格式。然而,与PDF文件相比,CAJ文件的查看和分享并不那么便捷。下面,我会为你介绍三种免费且简便的方法,帮助你将CAJ文件转化为PDF格…

PSP - Jackhmmer 搜索 EMBL 序列数据库的相似序列

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131817060 EMBL (European Molecular Biology Laboratory,欧洲分子生物实验室):EMBL 数据库是一个由欧洲生物信息学研究所…

Microsoft Outlook如何定时发送邮件

点击New Emai 选择Options→Delay Delivery→Do not deliver before→Close

基于linux下的高并发服务器开发(第二章)- 2.13 匿名管道通信案例

实现 ps aux | grep xxx 父子进程间通信 子进程: ps aux, 子进程结束后,将数据发送给父进程 父进程:获取到数据,过滤 pipe() execlp() 子进程将标准输出 stdout_fileno 重定向到管道的写端。 dup2 07 / 匿名管道…

java项目之班级同学录网站(ssm+mysql+jsp)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的班级同学录网站。技术交流和部署相关看文章末尾! 开发环境: 后端: 开发语言:Java 框架&a…

强化学习之DQN(deep Q-network)算法

一、简介 DQN算法是深度学习领域首次广泛应用于强化学习的算法模型之一。它于2013年由DeepMind公司的研究团队提出,通过将深度神经网络与经典的强化学习算法Q-learning结合,实现了对高维、连续状态空间的处理,具备了学习与规划的能力。 二、…

使用Pandas计算两个系统客户名称的相似度

引言: 在日常业务处理中,我们经常会面临将不同系统中的数据进行匹配和比对的情况。特别是在涉及到客户管理的领域,我们需要确保两个系统中的客户记录是准确、一致和无重复的。 本文将介绍如何使用Python的Pandas库来处理这个问题。我们将以…

Linux: cannot read file data

报错: Could not load library libcudnn_cnn_infer.so.8. Error: /home/qc/miniconda3/envs/DNAqc/lib/python3.10/site-packages/torch/lib/libcudnn_cnn_infer.so.8: cannot read file data Please make sure libcudnn_cnn_infer.so.8 is in your library path! A…

淘宝商品详情数据接口(APP端,H5端),监控淘宝商品历史价格及价格走势,接口代码对接

淘宝商品详情数据接口APP端,H5端代码如下: 公共参数 名称类型必须描述交流中心18179014480keyString是调用key(必须以GET方式拼接在URL中)注册Key和secret接入secretString是调用密钥api_nameString是API接口名称(包括…

JMeter做http接口功能测试

1. 普通的以key-value传参的get请求 e.g. 获取用户信息 添加http请求;填写服务器域名或IP;方法选GET;填写路径;添加参数;运行并查看结果。 2. 以Json串传参的post请求 e.g. 获取用户余额 添加http请求;…

行业数据和报告到底应该如何去找?

信息时代,经常要对行业信息进行分析。这时首先就是要进行信息收集和筛选,如果我们懂得构建自己的工作工具和数据来源,效率会蹭蹭往上涨。 找行业报告、了解行业趋势,提高效率。 1. 国家权威 国家统计局:这个网站覆盖…

C++无锁编程——无锁队列(queue)

C无锁编程——无锁队列(queue) 贺志国 2023.7.11 上一篇博客给出了最简单的C数据结构——栈的几种无锁实现方法。队列的挑战与栈的有些不同,因为Push()和Pop()函数在队列中操作的不是同一个地方。因此同步的需求就不一样。需要保证对一端的修改是正确的&#xff0…

CRC校验原理全面解读

目录 1. 简介2. 原理2.1 CRC的发送与接收2.2 CRC校验码的生成2.3 CRC校验码的校验 3. 拓展问题3.1 模2除法为什么等同于异或运算?3.2 为什么除数的位数和被除数补充的位数相差为1?3.3 为什么CRC校验码不能纠正错误,只能检测错误? …

【数据结构】二叉树详解(2)

⭐️ 前言 ✨ 往期文章链接:二叉树的概念性质 上一篇我们讲了二叉树的结构定义,以及前序/中序/后序的递归遍历,还有一些二叉树的接口实现,本篇我们补充一个二叉树的接口 BinaryTreeDepth。✨上一篇文章链接:二叉树详…

第108天:免杀对抗-Python混淆算法反序列化打包生成器Py2exeNuitka

知识点 #知识点: 1、Python-对执行代码做文章 2、Python-对shellcode做文章 3、Python-对代码打包器做文章#章节点: 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指…

SpringCloud学习路线(7)—— 统一网关Gateway

一、引言 (一)需求: 服务器中的微服务只允许内部人员调用或是内网人员进行调用,拒绝外网人员访问。 (二)如何实现需求? 网关 (三)网关的功能 身份认证和权限校验服务…

十八、Unity游戏引擎入门

1、下载 首先需要下载Unity Hub,下载网址:https://unity.com/cn。 然后在其中下载Unity编辑器并安装,可选择最新版本。 接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件…

实训笔记7.19

实训笔记7.19 7.19一、座右铭二、Hadoop的HDFS分布式文件存储系统的相关原理性内容2.1 HDFS上传数据的流程2.2 HDFS下载数据的流程2.3 HDFS中NameNode和SecondaryNameNode工作机制(涉及到HDFS的元数据管理操作)2.4 HDFS中NameNode和DataNode的工作机制&a…

【C++】仿函数(less)

C中的仿函数 class Solution { public:struct cmp{bool operator()(const pair<string,int>&kv1,const pair<string,int>&kv2){if(kv1.second<kv2.second) return true;if(kv1.secondkv2.second&&kv1.first>kv2.first) return true;return …