队列循环——C++引用详解【入队元素不引用 出队元素引用】(C语言版)

news2024/9/27 15:33:35

出队元素引用 入队元素不引用解释:

在给定的代码中,对于 DeQueue 函数的参数使用引用 (&),而对于 EnQueue 函数的参数没有使用引用,是基于函数内部对这些参数值的修改方式来确定的。

让我们分析一下每个函数:

  1. EnQueue 函数:

    //循环队列入队
    bool EnQueue(SqQueue &Q,ElemType x)//Q是结构体变量 结构体发生改变 故引用
    {
        if((Q.rear+1)%MaxSize==Q.front)//判断队列是否满了,满了就不能入队了
        {
            return false;
        }
        Q.data[Q.rear]=x;//放入元素
        Q.rear=(Q.rear+1)%MaxSize;//rear要加1,如果大于数组下表 回到开头
        return true;
    
    }

    在这个函数中,ElemType x 没有使用引用,因为 EnQueue 函数的目的是将一个元素入队,而不需要修改传递给它的元素的实际值。函数只需要知道元素的值,以便将其入队。因此,在这种情况下,使用引用是不必要的。

(因为队列空间已经定义好了 空间并没有发生变化 所以插入元素不会影响结构体的空间 也没有修改结构体 故不需要引用)——

队列的空间已经在结构体中预先定义好了,因此在进行入队操作时,并没有对结构体本身进行修改或重新分配空间。因为元素的插入并没有改变结构体的空间,所以不需要使用引用来传递元素的值。

结构体作为参数传递时,会将结构体的副本传递给函数。对于入队操作而言,只需将元素的值复制到队列的数组中,而不需要修改结构体的其他部分。因此,可以直接通过值传递来处理入队操作,而无需使用引用。

相反,对于出队操作,需要修改结构体中的队头指针等信息,并且需要将出队的元素的值返回给调用者。因此,在出队操作中使用引用,可以通过引用传递将修改的值带回到调用者的作用域。

2.   DeQueue 函数:

//出队
bool DeQueue(SqQueue &Q,ElemType &x)
{
    if(Q.rear==Q.front)//队列为空,无法出队
    {
        return false;
    }
    x=Q.data[Q.front];//出队
    Q.front=(Q.front+1)%MaxSize;
    return true;
}

在出队函数中,ElemType &x 被使用为引用,因为 DeQueue 函数的目的是检索出队的元素值,并使用该值修改变量 x。该函数需要返回一个布尔状态(成功或失败)和出队的元素本身。使用引用允许函数修改 x 的值并将其传递回调用代码。

在函数的参数列表中,ElemType &x 表示 x 是一个引用,它引用了在函数调用时传递给 DeQueue 函数的某个变量。当调用 DeQueue 函数时,实际参数(传递给函数的参数)会与 ElemType &x 关联,从而允许函数修改这个实际参数的值。

具体来说,在函数体内部,x = Q.data[Q.front]; 这一行代码将队列的队头元素的值赋给了 x。由于 x 是通过引用传递的,任何对 x 的修改都会影响到调用者在函数调用时传递的相应变量因此,当 DeQueue 函数执行完毕后,调用者能够通过查看 x 的值来获取从队列中出队的元素。

总之,在 DeQueue 函数中使用引用的选择允许它修改出队元素的值,而在 EnQueue 函数中,没有必要修改入队元素的值,因此不使用引用。

简洁理解:

当调用 DeQueue 函数时,你会传递一个变量作为参数,这个变量的值是由 DeQueue 函数来改变的。这个变量是通过引用传递的,这意味着函数内部可以直接修改这个变量所引用的内存地址的值。

ElemType element; // 声明一个变量用于存储出队的元素
bool ret = DeQueue(Q, element);

在这里,element 是一个变量,它的值会在 DeQueue 函数中被修改。因为在 DeQueue 函数的参数列表中,ElemType &x 使用了引用,所以 x 实际上是指向 element 这个变量的引用。当 DeQueue 函数执行时,它会将队列中的队头元素的值赋给 x,也就是 element

通过这种方式,当 DeQueue 函数执行完毕后,element 的值就被成功地改变成了队头元素的值。这样,在函数外部就能够使用 element 来访问出队的元素。这就是引用的作用,它允许函数修改调用者提供的变量的值,而不是仅仅操作它的副本。

而对于入队

在这个特定的队列实现中,入队操作不需要引用,是因为在入队的过程中,只是往队列的数组中添加一个元素,而并不需要修改调用者传递的元素的值。入队操作只需要知道要添加的元素的值即可,而不需要改变传递给函数的实际参数。

考虑入队函数的定义:

bool EnQueue(SqQueue &Q, ElemType x)
{
    if ((Q.rear + 1) % MaxSize == Q.front)
    {
        return false; // 判断队列是否满了,满了就不能入队了
    }
    Q.data[Q.rear] = x; // 放入元素
    Q.rear = (Q.rear + 1) % MaxSize; // rear 要加 1,如果大于数组下标,回到开头
    return true;
}

在这里,ElemType x 是通过值传递的方式传递给 EnQueue 函数的。因为在函数内部并没有修改 x 的值,而只是将它作为一个新元素添加到队列中,所以不需要使用引用。

总体而言,引用通常用于需要在函数中修改调用者提供的变量值的情况。EnQueue 中,并不需要修改调用者传递的元素的值,因此没有使用引用。而在 DeQueue 中,需要通过引用来修改调用者传递的变量,以便传递出队的元素的值。


完整代码:

#include <stdio.h>
#include <stdlib.h>

#define MaxSize 5 //define 后不需要分号
typedef int ElemType;
typedef struct{
    ElemType data[MaxSize];//数组,存储Maxsize-1个元素
    int front,rear;//队列头 队列尾
    int top;
}SqQueue;

void InitQueue(SqQueue &Q)
{
    Q.front=Q.rear=0;//初始化队列,就是让头和尾都指向0号
}

//判断队列是否为空
bool IsEmpty(SqQueue Q)
{
    return Q.rear==Q.front;//返回真 就是空 返回假就是非空
}
//循环队列入队
bool EnQueue(SqQueue &Q,ElemType x)//Q是结构体变量 结构体发生改变 故引用
{
    if((Q.rear+1)%MaxSize==Q.front)//判断队列是否满了,满了就不能入队了
    {
        return false;
    }
    Q.data[Q.rear]=x;//放入元素
    Q.rear=(Q.rear+1)%MaxSize;//rear要加1,如果大于数组下表 回到开头
    return true;

}
//出队
bool DeQueue(SqQueue &Q,ElemType &x)
{
    if(Q.rear==Q.front)//队列为空,无法出队
    {
        return false;
    }
    x=Q.data[Q.front];//出队
    Q.front=(Q.front+1)%MaxSize;
    return true;
}
int main(){
    SqQueue Q; //基本类型为结构体的 栈
    InitQueue(Q);//初始化栈
    bool ret;
    ret= IsEmpty(Q);
    if(ret)
    {
        printf("SqQueue is Empty\n");
    }else{
        printf("SqQueue is not Empty\n");
    }
    EnQueue(Q,3);
    EnQueue(Q,4);
    EnQueue(Q,5);
    ret=EnQueue(Q,6);
    ret=EnQueue(Q,7);
    if(ret){
        printf("EnQueu success\n");
    } else{
        printf("EnQueue failed\n");
    }

    ElemType element;//存储出队元素
    ret=DeQueue(Q,element);
    if(ret){
        printf("DeQueue success\n");
    } else{
        printf("DeQueue failed\n");
    }
//再入队
    ret=EnQueue(Q,8);
    if(ret){
        printf("EnQueu success\n");
    } else{
        printf("EnQueue failed\n");
    }

    return 0;
}

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

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

相关文章

SQL-Labs靶场“29-31”关通关教程

君衍. 一、二十九关 基于错误的WAF单引号注入1、源码分析2、HTTP参数污染3、联合查询注入4、updatexml报错注入 二、三十关 基于错误的WAF双引号注入1、源码分析2、联合查询注入3、updatexml报错注入 三、三十一关 基于错误的WAF双引号括号注入1、源码分析2、联合查询注入3、up…

windows10下如何通过命令行方式新增一个外部WLAN的Wifi热点并连接

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、背景 最近碰到2个家人windows下连接电脑热点的问题&#xff0c;一个是在某个培训场所显示的热点名称不是公布的热点名称&#xff0c;而是一个乱码&#xff0c;在家里和工作单位热点则显示正常&#xff…

【二叉搜索树】【前后指针】Leetcode 501. 二叉搜索树中的众数

【二叉搜索树】【前后指针】Leetcode 501. 二叉搜索树中的众数 解法1 中序遍历双指针解法2 我的复杂方法 先中序遍历到数组&#xff0c;之后hashmap遍历判断众数 之后转化为数组输出 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;-----------…

(已解决)emoji及其特殊符号在vue中的使用

问题叙述 使用问题&#xff1a;在表情库中点击后无法展示对应的emoji表情&#xff0c;仅仅显示Unicode代码编号&#xff0c;按照vue eslint规则更改添加分号后&#xff0c;没有报错但是依旧无法正确渲染。 问题源码&#xff1a; <template><div><!-- 被点击的…

KubeSphere简介,功能介绍,优势,架构说明及应用场景

KubeSphere 是在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器平台&#xff0c;提供简单易用的操作界面以及向导式操作方式&#xff0c;在降低用户使用容器调度平台学习成本的同时&#xff0c;极大减轻开发、测试、运维的日常工作的复杂度&#xff0c;旨…

【问题解决】| 关于torch无法使用GPU的一些实验探索,思考

文章目录 1 研究背景2 问题解决2.1 问题一&#xff0c;这两个版本分别是怎么得到的&#xff1f;2.2 问题二&#xff0c;Windows下安装CUDA Tookit 是必须的吗&#xff1f;2.3 问题三&#xff0c;驱动版本必须大于等于运行时版本吗&#xff1f;2.4 问题四&#xff0c;只运行pip …

力扣110 平衡二叉树 Java版本

文章目录 题目描述代码 题目描述 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,…

python笔记_程序流程控制

A&#xff0c;顺序控制 程序从上到下逐行执行 python定义变量时&#xff0c;会合法地向前引用 age 1 age2 age 1 age2 age 1 age 1 ——>错误&#xff0c;age应在age2之前 B&#xff0c;分支控制 1&#xff0c;单分支if 语法 if 条件表达式 &#xff1a; 代码块 说明…

代码随想录day10(2)字符串:反转字符串Ⅱ (leetcode541)

题目要求&#xff1a;给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起, 每计数至 2k 个字符&#xff0c;就反转这 2k 个字符中的前 k 个字符。如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前…

两天学会微服务网关Gateway-Gateway简介

锋哥原创的微服务网关Gateway视频教程&#xff1a; Gateway微服务网关视频教程&#xff08;无废话版&#xff09;_哔哩哔哩_bilibiliGateway微服务网关视频教程&#xff08;无废话版&#xff09;共计17条视频&#xff0c;包括&#xff1a;1_Gateway简介、2_Gateway工作原理、3…

Git 基于ED25519、RSA算法生成 SSH 密钥

Git 基于ED25519、RSA算法生成 SSH 密钥 基于ED25519算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t ed25519 -C "邮箱地址"基于RSA算法&#xff0c;生成密钥对命令如下&#xff1a; ssh-keygen -t rsa -C "<注释内容>"基于ED255…

中国各省绿色金融试点DID数据集(2010-2023)

一、数据简介 最新的2010-2023年中国31省绿色金融试点DID数据&#xff0c;供大家研究使用。 数据说明&#xff1a;内含绿色金融改革创新试验区名单&#xff0c;将试验区获批当年及以后的政策虚拟变量项是否试点赋值为1&#xff0c;获批之前赋值为0。其中赣江新区、贵安新区为国…

MySQL基础-----SQL语句之DDL语句

目录 前言 开启登录数据库 一、数据库操作 1.查询所有数据库 2.切换使用数据库 3.查询当前使用的数据库 4.创建数据库 创建一个hello数据库, 使用数据库默认的字符集。 创建一个itheima数据库&#xff0c;并且指定字符集 5.删除数据库 二、表操作 1.查询当前数据库所有…

递归与递推(蓝桥杯 c++)

目录 题目一&#xff1a; 代码&#xff1a; 题目二: 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目一&#xff1a; 代码&#xff1a; #include<iostream> #include<cstring> using namespace std; int …

deep learning with pytorch(一)

1.create a basic nerual network model with pytorch 数据集 Iris UCI Machine Learning Repository fully connected 目标:创建从输入层的代码开始&#xff0c;向前移动到隐藏层&#xff0c;最后到输出层 # %% import torch import torch.nn as nn import torch.nn.funct…

Vue开发实例(五)修改项目入口页面布局

修改项目入口 一、创建新入口二、分析代码&#xff0c;修改入口三、搭建项目主页面布局1、Container 布局容器介绍2、创建布局3、布局器铺满屏幕4、创建Header页面5、加入Aside、Main和Footer模块 一、创建新入口 创建新的入口&#xff0c;取消原来的HelloWorld入口 参考代码…

图像分割 - 凸包(图像的轮廓)

1、前言 之前的文章 绘制几何图形的轮廓,介绍了矩形包围框和圆形包围框。 虽然这两种包围框以及足够逼近图形的边缘,但为了保持几何形状(矩形和圆形),其实与图形的真实轮廓贴合度较差,为了更贴近图形轮廓,这里介绍凸包。 凸包:图形最外层的端点,将端点连接起来,围…

[C++]AVL树怎么转

AVL树是啥 一提到AVL树&#xff0c;脑子里不是旋了&#xff0c;就是悬了。 AVL树之所以难&#xff0c;并不是因为结构难以理解&#xff0c;而是因为他的旋转。 AVL树定义 平衡因子&#xff1a;对于一颗二叉树&#xff0c;某节点的左右子树高度之差&#xff0c;就是该节点的…

训练2布线 玛露希尔

前言 这不是雕刻 是布线纹理绘制blender材质渲染 2D 3D 起手式 八点眼 侧峰线 三角鼻(三面鼻) 下颚角 额, 嘴 线 法令环 橄榄嘴

linux高级编程:线程(二)、进程间的通信方式

线程&#xff1a; 回顾线程&#xff08;一&#xff09;&#xff1a; 1.线程间通信问题 线程间共享同一个资源&#xff08;临界资源&#xff09; 互斥&#xff1a; 排他性访问 linux系统 -- 提供了Posix标准的函数库 -- 互斥量&#xff08;互斥锁&#xff09; 原子操作&#x…