数据结构(3.5)——队列的顺序实现

队列的顺序实现

#define MaxSize 10//定义队列中元素的最大个数
typedef struct {int data[MaxSize];//用静态数组存放队列元素int front, rear;//队头指针和队尾指针
} SqQueue;void testQueue() {SqQueue Q;//声明一个队列(顺序存储)
}

队列的初始化操作和判空

//初始化队列
void InitQueue(SqQueue& Q) {//初始时 队头、队尾指针指向0Q->rear = Q->front = 0;
}
//判断队列是否为空
bool QueueEmpty(SqQueue Q) {if (q.rear == Q.front) {//判空条件return true;}else {return false;}
}

循环队列——入队操作

以下情况我们重点先考虑尾指针指向队尾元素的后一位情况

队列的入队操作只能从队尾入队(插入)

//入队
bool EnQueue(SqQueue& Q, int x) {if (Q.rear + 1) % MaxSize == Q.front){//判断队满return false;//队满报错}else {Q.data[Q.rear] = x;//新元素插入队尾Q.rear = (Q.rear + 1) % MaxSize;//队尾指针加1取模,队尾指针后移return true;}
}

该函数中的

		Q.rear = (Q.rear + 1) % MaxSize;//队尾指针加1取模

这一行代码实则是将一个顺序队列变成了循环队列

循环队列——入队操作

//出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue& Q, int& x) {if (Q.rear == Q.front) {//判断队空return false;//队空则报错}else {x = Q.data[Q.front];Q.front = (Q.front + 1) & MaxSize;//队头指针后移return true;}
}

循环队列——读取队头操作

读取队头的操作和出队操作很类似,只是将表格引用符号去掉,并且不要让队头指针往后移就行

//获得队头元素的值,用x返回
bool GetHead(SqQueue Q, int& x) {if (Q.rear == Q.front) {//判断队空return false;//队空则报错}else {x = Q.data[Q.front];return true;}
}
void testQueue() {SqQueue Q;//声明一个队列(顺序存储)
}

计算队列元素个数:

(rear+MaxSize-front)%MaxSize

方法二:增加一个辅助变量size判断空判满

由于刚刚第一种方法判空和判满会造成一些不必要的内存空间浪费,于是我们在队列中添加一个size来表示队列的长度,并且记录队列的入队和出队变化

typedef struct {int data[MaxSize];//用静态数组存放队列元素int front,rear;//队头指针和队尾指针int size;//队列当前长度
} SqQueue;
//初始化队列
void InitQueue(SqQueue& Q) {//初始时 队头、队尾指针指向0Q.rear = Q.front = 0;Q.size=0;
}

方法三:增加一个辅助变量tag判断空判满 

#define MaxSize 10//定义队列中元素的最大个数
typedef struct {int data[MaxSize];//用静态数组存放队列元素int front,rear;//队头指针和队尾指针int tag;//最近进行的是删除为0/插入为1
} SqQueue;

例子:

// 初始化队列
void InitQueue(SqQueue *Q) {Q->front = Q->rear = 0;Q->tag = 0;
}// 判断队列是否为空
int IsEmpty(SqQueue Q) {return Q.front == Q.rear && Q.tag == 0;
}// 判断队列是否已满
int IsFull(SqQueue Q) {return Q.front == Q.rear && Q.tag == 1;
}// 入队操作
int EnQueue(SqQueue *Q, int x) {if (IsFull(*Q)) {return 0; // 队列已满,入队失败}Q->data[Q->rear] = x;Q->rear = (Q->rear + 1) % MaxSize; // 循环使用数组Q->tag = 1;return 1; // 入队成功
}// 出队操作
int DeQueue(SqQueue *Q, int *x) {if (IsEmpty(*Q)) {return 0; // 队列为空,出队失败}*x = Q->data[Q->front];Q->front = (Q->front + 1) % MaxSize; // 循环使用数组Q->tag = 0;return 1; // 出队成功
}

 总结:

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

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

相关文章

大模型面试题目

1.为什么需要做位置编码 位置编码(Positional Encoding)在变换器(Transformer)模型中非常重要,因为变换器架构本身没有内置的顺序信息。变换器使用的是自注意力机制,它能够捕捉输入序列中所有词之间的相关性…

论文解析——Transformer 模型压缩算法研究及硬件加速器实现

作者及发刊详情 邓晗珂,华南理工大学 摘要 正文 实验平台 选取模型: T r a n s f o r m e r b a s e Transformer_{base} Transformerbase​ 训练数据集:WMT-2014 英语-德语翻译数据集、IWSLT-2014 英语-德语互译数据集 Transformer模…

kpatch制作内核热补丁步骤总结

零、原理及参考 kpatch入门实践教程-CSDN博客 Kpatch 使用过程及其原理-CSDN博客 一、准备工作 安装对应版本的kpatch-build.rpm并解决依赖diff -Naur dir1 dir2 > hot.patch 拿到补丁文件下载对应内核版本的src.rpm安装好对应的开发包kernel-debuginfo,kern…

数据库开发:mysql基础一

文章目录 数据库开发Day15:MySQL基础(一)一、MySQL介绍与安装【1】MySQL介绍(5)启动MySQL服务(6)修改root登陆密码 二、SQL简介三、数据库操作四、数据表操作4.1、数据库数据类型4.2、创建数据表…

对标 GPT-4o 的开源实时语音多模态模型:Moshi

是由法国的 AI 实验室 Kyutai 推出的实时语音多模态模型,支持听、说、看,最关键的是你现在就可以在浏览器中使用,如果这个链接延迟高,可以试试这个, 无需输入邮箱,点击 Join queue 即可。 简单体验了下,比…

#### golang中【堆】的使用及底层 ####

声明,本文部分内容摘自: Go: 深入理解堆实现及应用-腾讯云开发者社区-腾讯云 数组实现堆 | WXue 堆(Heap)是实现优先队列的数据结构,Go提供了接口和方法来操作堆。 应用 package mainimport ("container/heap&q…

结构方程模型-验证性因子分析模型

初级 第7讲 验证性因子分析模_哔哩哔哩_bilibili

claude3.5写作——《基于灰色预测的中国人口数量预测》

文章目录 站点和提问引言一、灰色预测模型介绍二、中国历年人口数据三、灰色预测模型的建立1.建立原始序列2.生成1-AGO序列3.计算背景值4.构造数据矩阵并计算参数5.模型检验6.模型预测 四、预测结果分析五、政策建议结语参考文献 站点和提问 站点:中国官方克劳德3.…

光伏电站数据采集方案(基于工业路由器部署)

​ 一、方案概述 本方案采用星创易联SR500工业路由器作为核心网关设备,实现对光伏电站现场数据的实时采集、安全传输和远程监控。SR500具备多接口、多功能、高可靠性等特点,能够满足光伏电站数据采集的各种需求。(key-iot.com/iotlist/sr500…

RK3568平台(opencv篇)ubuntu18.04上安装opencv环境

一.什么是 OpenCV-Python OpenCV-Python 是一个 Python 绑定库,旨在解决计算机视觉问题。   Python 是一种由 Guido van Rossum 开发的通用编程语言,它很快就变得非常流行,主要是 因为它的简单性和代码可读性。它使程序员能够用更少的代码行…

网络IO模型之多路复用器.md

多路复用是什么?怎么理解? 本文主要涉及为 程序中处理网络IO时的模型,对于系统内核而言网络IO模型。这里只做普及使用 前置知识,什么是IO?怎么理解IO IO其实就是In和Out。中文翻译是输入和输出,只要涉及到输…

clone()方法

在Java中,clone() 方法是一个非常有趣且强大的工具,用于创建对象的一个副本。这个方法位于 Object 类中,因此可以被所有类使用。让我们讨论一下它的几个要点: 什么是克隆? 克隆就是创建一个对象的新副本,这…

2005-2022全国及各省家庭承包耕地流转总面积及经营耕地面积数据(无缺失)

2005-2022全国及各省家庭承包耕地流转总面积及经营耕地面积数据(无缺失) 1、时间:2005-2022年 2、范围:全国及30省 3、指标:家庭承包耕地流转总面积、家庭承包经营耕地面积、土地流转率、 4、来源:农村…

《web应用技术》第十一次课后作业

验证过滤器进行权限验证的原理。 创建Filter: package com.example.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;WebFilter(urlPatterns "/*") public class DemoFilter implements Filter …

adobe pdf设置默认打开是滚动而不是单页视图

上班公司用adobe pdf,自己还不能安装其它软件。 每次打开pdf,总是默认单页视图,修改滚动后,下次打开又 一样,有时候比较烦。 后面打开编辑->首选项, 如下修改,下次打开就是默认滚动了

Websocket通信实战项目(图片互传应用)+PyQt界面+python异步编程(async) (上)服务器端python实现

Rqtz : 个人主页 ​​ 共享IT之美,共创机器未来 ​ Sharing the Beauty of IT and Creating the Future of Machines Together 目录 项目背景 ​编辑​专有名词介绍 服务器GUI展示 功能(位置见上图序号) 客户端GUI展示(h5cssjs&#xf…

flask的进阶使用方法

【 一 】一对多关系 # 1 一对一 [本质就是一对多--》多的那个唯一] # 2 一对多 # 3 多对多1.1 关系 #### 一对多关系 class Hobby(Base):__tablename__ hobbyid Column(Integer, primary_keyTrue)caption Column(String(50), default篮球)def __str__(self):return sel…

pydub、ffmpeg 音频文件声道选择转换、采样率更改

快速查看音频通道数和每个通道能力判断具体哪个通道说话;一般能量大的那个算是说话 import wave from pydub import AudioSegment import numpy as npdef read_wav_file(file_path):with wave.open(file_path, rb) as wav_file:params wav_file.getparams()num_cha…

Android10以上实现获取设备序列号功能

Android10以上实现获取设备唯一标识,目前只支持华为和荣耀设备。实现原理:通过无障碍服务读取序列号界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…