栈和队列(2)——队列

队列的基本概念

1. 队列定义:只允许在一端进行插入,在另一端进行删除的线性表。

2. 队列特点:先进先出(FIFO)。

3. 队列基本操作:初始化队列、销毁队列、入队、出队、读队头元素、判队列空等。

InitQueue(&Q):初始化队列,构造一个空队列Q。
DestroyQueue(&Q):销毁队列。销毁并释放队列Q所占用的内存空间。
EnQueue(&Q,x):入队,若队列Q未满,将x加入,使之成为新的队尾。
DeQueue(&Q,&x):出队,若队列Q非空,删除队头元素,并用x返回。
GetHead(Q,&x):读队头元素,若队列Q非空,则将队头元素赋值给x。
QueueEmpty(Q):判队列空,若队列Q为空返回true,否则返回false。

队列的顺序实现

用一组地址连续的存储单元,依次存放从队头到队尾的数据元素,称为顺序队列

需要附设两个指针:队头指针(front)队尾指针(rear),分别指向队头元素和队尾元素。

#define MAXSIZE 50	//定义队列中元素的最大个数
typedef struct{
	ElemType data[MAXSIZE];	//存放队列元素
	int front,rear;
}SqQueue;

初始状态(队空条件):Q.front = Q.rear = 0。
进队操作:队不满时,先送值到队尾元素,再将队尾指针加1。
出队操作:队不空时,先取队头元素值,再将队头指针加1。

“假溢出”:如果在插入E的基础上再插入元素F,将会插入失败。因为rear==MaxSize,尾指针已经达到队列的最大长度。但实际上队列存储空间并未全部被占满,这种现象叫做“假溢出”。假溢出的原因是顺序队列进行队头出队、队尾入队,造成数组前面会出现空闲单元未被充分利用。

循环队列 

解决假溢出的方法就是后面满了,就再从头开始,也就是头尾相接的循环。队列这种头尾相接的顺序存储结构称为循环队列。

 

初始时:Q.front = Q.rear=0
队首指针进1:Q.front = (Q.front + 1) % MAXSIZE
队尾指针进1:Q.rear = (Q.rear + 1) % MAXSIZE
队列长度:(Q.rear - Q.front + MAXSIZE) % MAXSIZE

问题:当循环对列为空或满时,都是队尾指针等于队头指针,即rear=front 。当rear=front时,该是判满还是判空呢?

为了区分队空还是队满的情况,有三种处理方式:

(1)牺牲一个单元来区分队空和队满,入队时少用一个队列单元,这是种较为普遍的做法,约定以“队头指针在队尾指针的下一位置作为队满的标志”。

队满条件: (Q.rear + 1)%Maxsize == Q.front
队空条件仍: Q.front == Q.rear
队列中元素的个数: (Q.rear - Q .front + Maxsize)% Maxsize
(2)类型中增设表示元素个数的数据成员。这样,队空的条件为 Q.size == O ;队满的条件为 Q.size == Maxsize 。这两种情况都有 Q.front == Q.rear。

typedef int ElemType;   
#define MAXSIZE 50  

typedef struct{
    ElemType data[MAXSIZE];
    int front;  //头指针
    int rear;   //尾指针,若队列不空,指向队列尾元素的下一个位置
    int size;
}SqQueue;

(3)类型中增设tag 数据成员,以标记最近一步操作是入队(标记为1)还是出队(标记为0)。只有最近一步为出队后的Q.rear==Q.front,才能确定为队空;队满同理。

typedef int ElemType;   
#define MAXSIZE 50  

typedef struct{
    ElemType data[MAXSIZE];
    int front;  //头指针
    int rear;   //尾指针,若队列不空,指向队列尾元素的下一个位置
    int tag;
}SqQueue;
//rear:指向队尾下一个元素	front:指向队头元素 	
#define MaxSize 3
typedef struct{
	int data[MaxSize];
	int front;		//队头指针 
	int rear;		//队尾指针 
}SqQueue; 

//0.初始化
void InitQueue(SqQueue &Q){
	//牺牲一个存储空间		
	//rear:指向队尾下一个元素	front:指向队头元素 
	//判空条件:front==rear
	//判满条件:(rear+1)%MaxSize==front 
	Q.front=0;
	Q.rear=0;
} 

//1.入队操作
bool EnQueue(SqQueue &Q,int x){
	if((Q.rear+1)%MaxSize==Q.front){	//	判断队列是否满 
		return false;
	}
	Q.data[Q.rear]=x;	//存值 
	Q.rear=(Q.rear+1)%MaxSize;	//	向下一个存储单元移动 	
	return true;
} 

//2.出队操作
bool DeQueue(SqQueue &Q,int &x){
	if(Q.front==Q.rear){	//	判断队列是否为空  
		return false;
	}
	x=Q.data[Q.front];	//取值 
	Q.front=(Q.front+1)%MaxSize;	//	向下一个存储单元移动 
	return true; 
} 

//3.获取队头元素
bool GetHead(SqQueue &Q,int &x){
	if(Q.front==Q.rear){	//	判断队列是否为空 
		return false;
	}
	x=Q.data[Q.front];
	return true;
} 

队列的链式实现

定义—链式队列结点 

typedef struct LinkNode{
    ElemType data;
    struct LinkNode *next;
}LinkNode;

typedef struct{
    LinkNode *front,*rear;
}LinkQueue;

初始化

void InitQueue(LinkQueue &Q){
	LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));	// 创建头结点
	s->next=NULL;
	Q.front=s;
	Q.rear=s; 
} 

入队

bool EnQueue(LinkQueue &Q,int x){
	//无需判断队满
	LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
	s->data=x;
	
	//结点后插 
	s->next=Q.rear->next;
	Q.front->next=s; 
	Q.rear=s;
	return true;
} 

出队

bool DeQueue(LinkQueue &Q,int &x){
	if(Q.front==Q.rear){	//	判断队列是否为空 
		return false;
	}
	
	LinkNode *p=Q.front->next;	//	获取所要出队的结点
	x=p->data;
	
	if(p->next==NULL){	//	判断是否为最后一个元素 
		Q.rear=Q.front;
	}
	Q.front->next=p->next; 
	
	free(p);
	return true; 
} 

获取队头元素 

bool GetHead(LinkQueue &Q,int &x){
	if(Q.front==Q.rear){	//	判断队空 
		return false;
	}
	LinkNode *p=Q.front->next;
	x=p->data;
	return true; 
} 

双端队列 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

凭什么你说不是就不是-zzj杯·UMLChina建模答题赛第6赛季第2轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。 如果有第4题,第4题为附加题&am…

【hacker送书第14期】AI训练师算法与模型训练从入门到精通

全面精通人工智能训练,成为行业领先、更懂AI的人! 前言内容简介总结参与方式 前言 在人工智能(AI)技术日益成熟的今天,AI训练师成为了一个新兴且重要的职业。他们不仅需要掌握AI的核心技术,还要能够将这些…

一文详细讲解进销存系统(附架构图、流程、功能介绍)

企业经营的七大要素是“人、财、物、产、供、销、存”,进销存管理就占到了其中的多项。然而,许多企业在进销存管理方面面临着诸多痛点问题,例如库存管理混乱、采购销售流程不清晰、数据不准确等。这些问题不仅影响企业的运营效率,…

如何在Python爬虫等程序中设置和调用http代理

在Python爬虫中为了更好地绕过反爬机制,获取网页信息,有时可能需要在Python中应用代理服务,这样做的目的就是防止自己的ip被服务器封禁,造成程序运行时中断连接,那么如何在python中设置代理呢? 我们通过几个…

2024年【浙江省安全员-C证】试题及解析及浙江省安全员-C证复审考试

题库来源:安全生产模拟考试一点通公众号小程序 2024年【浙江省安全员-C证】试题及解析及浙江省安全员-C证复审考试,包含浙江省安全员-C证试题及解析答案和解析及浙江省安全员-C证复审考试练习。安全生产模拟考试一点通结合国家浙江省安全员-C证考试最新…

8、Node.js Express框架

五、Express框架 5.1概念 Express框架是一个基于Node.js平台的极简、灵活的WEB开发框架:www.express.com.cn 简单来说,Express是一个封装好的工具包,封装了很多功能,便于我们开发WEB应用 5.2安装 npm i express5.3 Express初体验 //01-express初体验.js //1.导入exrp…

Python(包和模块)

包 定义 包是将模块以文件夹的组织形式进行分组管理的方法,以便更好地组织和管理相关模块。 包是一个包含一个特殊的__init__.py文件的目录,这个文件可以为空,但必须存在,以标识目录为Python包。 包可以包含子包(子…

万方数据库功能亮点介绍及个人下载万方论文的方法

一、万方数据库介绍 万方数据知识服务平台是北京万方数据股份有限公司主要产品之一。该平台整合数亿条全球优质学术资源,集成期刊、学位、会议、标准、专利等十余种资源类型、品质知识资源、先进的发现技术、人性化设计于一身,是国内一流的品质知识资源…

18 实战:基于Tkinter和OpenCV的视频编码器:实现MPEG4矩形帧编码器

引言 在视频处理领域,视频编码器的设计与实现一直是研究的热点。本文将深入解析一段基于Python的代码,该代码利用Tkinter、OpenCV和NumPy库构建了一个MPEG4矩形帧编码器的图形用户界面(GUI)。通过详尽的代码讲解,帮助读者全面理解视频编码的基本原理及其在实际应用中的实…

12-Docker发布微服务

12-Docker发布微服务 Docker发布微服务 搭建SpringBoot项目 新建一个SpringBoot项目 选择依赖项Spring Web和Spring Boot Actuator 在com.qi.docker_boot下创建controller目录,并在该目录下创建OrderController的java类 OrderControllerjava类的内容如下&#xf…

【IEEE出版|:IEEE Xplore,EI Compendex,Scopus检索|征稿正在进行中!】

第七届机械工程与智能制造国际会议(WCMEIM 2024) 2024 7th World Conference on Mechanical Engineering and Intelligent Manufacturing 【会议信息】 会议日期:2024年11月15-17日 会议地点:中国武汉(武汉纺织大学…

如何成为开源代码库Dify的contributor:解决issue并提交PR

前言 Dify 是一个开源的大语言模型(LLM)应用开发平台,它融合了后端即服务(Backend as Service)和LLMOps的理念,旨在简化和加速生成式AI应用的创建和部署。Dify提供了一个用户友好的界面和一系列强大的工具…

前端如何安全存储密钥,防止信息泄露

场景 把公钥硬编码在前端代码文件里,被公司安全检测到了要整改,于是整理几种常见的前端密钥存储方案。 1. 设置环境变量再读取 在打包或部署前端应用时,可以将密钥配置为环境变量,在应用运行时通过环境变量读取密钥。这样可以将密…

深入了解 Three.js 中的材质与光照

开发领域:前端开发 | AI 应用 | Web3D | 元宇宙 技术栈:JavaScript、React、ThreeJs、WebGL、Go 经验经验:6年 前端开发经验,专注于图形渲染和AI技术 开源项目:github 晓智元宇宙、数字孪生引擎、前端面试题 大家好&am…

【Linux】网络基础常识{OSI七层模型 TCPIP 端口号 各种协议}_哪种nat类型适用于多个内部设备共享有限的公共ip地址

文章目录 1.网络常识 1.0DHCP协议1. 1IP地址/MAC地址/ARP协议是什么? IP/MACARP:IP ⇒ MAC 1.2手机连接wifi的原理 SSID与BSSID 手机连接wifiSSID与BSSID 1.3手机如何通过“数据/流量”上网?1.4电脑连接wifi的原理?电脑通过热点…

uniapp使用uni-push模拟推送

uniapp使用uni-push模拟推送 第一步先去uniapp开发者中心添加开通uni-push功能 这里的Android 应用签名可以先用测试的官网有,可以先用这个测试 官方测试链接文档地址 在项目中的配置文件勾选 组件中使用 如果要实时可以去做全局ws //消息推送模版uni.createPushMessage(…

ai画质修复工具有哪些?这4款AI照片修复神器建议收藏!

在当今这个科技迅猛发展的时代,人工智能(AI)正以前所未有的速度重塑我们的日常生活,而照片修复领域正是AI技术大放异彩的舞台。从年代久远、泛黄的老照片到追求极致细节的现代摄影佳作,AI以其非凡的能力,成…

MES管理系统在工艺管理中具备哪些作用

在现代制造业的洪流中,MES管理系统正逐步成为工艺管理领域的一股强大力量,它不仅革新了传统的管理方式,还为企业带来了前所未有的效率提升与成本控制优势。尽管许多企业尚未全面拥抱这一数字化变革,但MES管理系统在工艺管理中的潜…

IM_自定义audio播放消息

做即时通讯,除了文字、图片、表情、还有媒体消息,整理一下制作过程中自定义聊天框中的audio 效果图 tsx完整代码 AzEventBus 是解决点击多个语音播放时候,保证只有一个在播放;没什么特别的,就是自己简单封装了个EvenBusAzEventBus…

tcp shutdown, fin_wait1, fin_wait2, close_wait, last_ack, 谢特!

TCP 作为双向传输协议,如果你想只收不发,可以单向关掉发,shutdown(socket.SHUT_WR),但不建议这么做。 看以下代码: #!/Users/zhaoya/myenv/bin/python3 # client import socketclient_socket socket.socket(socket.…