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

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

在给定的代码中,对于 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;
}
  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆小果不会写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值