数据结构(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模…

JVM垃圾回收性能调优实战指南

JVM垃圾回收性能调优实战指南 一、引言 在Java应用程序中,垃圾回收(Garbage Collection, GC)是自动管理内存的重要机制。然而,不恰当的垃圾回收配置可能导致性能瓶颈,如频繁的GC暂停、内存碎片过多等。因此&#xff…

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

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

从GPT-1到GPT-3 预训练语言模型的演进与突破

本文由 ChatMoney团队出品 前言 Generative Pre-trained Transformer(GPT)系列是由OpenAI开发的预训练语言模型,它们在多种NLP任务中取得了令人瞩目的成绩,包括文章生成、代码生成、机器翻译和问答等。GPT系列模型的核心思想是通…

数据库开发: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

使用 ESP32 接收来自 MAX4466 模拟麦克风模块的数据,并通过 DAC 输出模拟音频信号,可以通过以下步骤实现:

硬件准备 ESP32 开发板MAX4466 模拟麦克风模块扬声器或耳机接线 MAX4466 模块输出(AO) -> ESP32 ADC 引脚(如 GPIO 34)ESP32 DAC 引脚(如 GPIO 25 或 GPIO 26) -> 扬声器或耳机软件准备 音频采集DAC 转码并播放代码实现 以下代码展示了如何从 MAX4466 读取模拟音频…

【Go语言入门学习笔记】Part7.闭包和defer关键字

一、前言 闭包有点像对象,而defer适合于类似功能中利用资源时,提前写几句defer 释放资源,防止后面释放资源忘记写释放资源。 二、学习代码 package mainimport ("fmt" )// getC的返回值是一个函数,需要的参数为空&…

GitHub Pull Request流程详解

GitHub Pull Request流程详解 在协作开发中,GitHub的Pull Request(PR)功能至关重要,它允许开发者在代码库中进行修改、审查和合并代码。本文将详细介绍GitHub Pull Request的完整流程,帮助你更好地理解和使用这一强大…

网络安全的十字路口:向“架构化”转移

市场条件正在快速变化 针对上述这些问题,在这段时间里,安全技术供应商推出了许多技术解决方案,比如SIEM、SOAR、XDR、UEBA等,但新产品的推出并未使得安全态势有所好转,许多问题依然存在,这导致了市场动态的…

【DevOps】Java内存分配与JVM参数详解

目录 引言 JVM内存结构 JVM参数概述 堆内存分配 年轻代与老年代 调整堆内存大小 调整年轻代与老年代比例 元空间分配 调整元空间大小 垃圾回收 调整GC参数 调整GC日志 线程栈分配 调整线程栈大小 性能调优 结论 在Java开发中,理解Java虚拟机&#x…

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

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

如何更改 Python pip 源为国内源

在使用 Python 安装包工具 pip 时,经常会遇到下载速度慢的问题。这通常是因为默认使用的官方源 https://pypi.org/simple 在国内访问速度较慢。为了提高下载速度,我们可以将 pip 源更改为国内的镜像源。本文将介绍如何临时和永久地更改 pip 源为国内源。…

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

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

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

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

C++ 运算符的优先级和关联性表

C 运算符的优先级和关联性表 1. Precedence and associativity (优先级和结合性)2. Alternative spellings (替代拼写)3. C operator precedence and associativity table (C 运算符的优先级和关联性表)References C documentation (C 文档) https://learn.microsoft.com/en-us…

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

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