当前位置:   article > 正文

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

引用队列元素c++

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

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

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

  1. EnQueue 函数:

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

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

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

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

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

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

2.   DeQueue 函数:

  1. //出队
  2. bool DeQueue(SqQueue &Q,ElemType &x)
  3. {
  4. if(Q.rear==Q.front)//队列为空,无法出队
  5. {
  6. return false;
  7. }
  8. x=Q.data[Q.front];//出队
  9. Q.front=(Q.front+1)%MaxSize;
  10. return true;
  11. }

在出队函数中,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 函数来改变的。这个变量是通过引用传递的,这意味着函数内部可以直接修改这个变量所引用的内存地址的值。

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

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

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

而对于入队

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

考虑入队函数的定义:

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

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

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


完整代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MaxSize 5 //define 后不需要分号
  4. typedef int ElemType;
  5. typedef struct{
  6. ElemType data[MaxSize];//数组,存储Maxsize-1个元素
  7. int front,rear;//队列头 队列尾
  8. int top;
  9. }SqQueue;
  10. void InitQueue(SqQueue &Q)
  11. {
  12. Q.front=Q.rear=0;//初始化队列,就是让头和尾都指向0号
  13. }
  14. //判断队列是否为空
  15. bool IsEmpty(SqQueue Q)
  16. {
  17. return Q.rear==Q.front;//返回真 就是空 返回假就是非空
  18. }
  19. //循环队列入队
  20. bool EnQueue(SqQueue &Q,ElemType x)//Q是结构体变量 结构体发生改变 故引用
  21. {
  22. if((Q.rear+1)%MaxSize==Q.front)//判断队列是否满了,满了就不能入队了
  23. {
  24. return false;
  25. }
  26. Q.data[Q.rear]=x;//放入元素
  27. Q.rear=(Q.rear+1)%MaxSize;//rear要加1,如果大于数组下表 回到开头
  28. return true;
  29. }
  30. //出队
  31. bool DeQueue(SqQueue &Q,ElemType &x)
  32. {
  33. if(Q.rear==Q.front)//队列为空,无法出队
  34. {
  35. return false;
  36. }
  37. x=Q.data[Q.front];//出队
  38. Q.front=(Q.front+1)%MaxSize;
  39. return true;
  40. }
  41. int main(){
  42. SqQueue Q; //基本类型为结构体的 栈
  43. InitQueue(Q);//初始化栈
  44. bool ret;
  45. ret= IsEmpty(Q);
  46. if(ret)
  47. {
  48. printf("SqQueue is Empty\n");
  49. }else{
  50. printf("SqQueue is not Empty\n");
  51. }
  52. EnQueue(Q,3);
  53. EnQueue(Q,4);
  54. EnQueue(Q,5);
  55. ret=EnQueue(Q,6);
  56. ret=EnQueue(Q,7);
  57. if(ret){
  58. printf("EnQueu success\n");
  59. } else{
  60. printf("EnQueue failed\n");
  61. }
  62. ElemType element;//存储出队元素
  63. ret=DeQueue(Q,element);
  64. if(ret){
  65. printf("DeQueue success\n");
  66. } else{
  67. printf("DeQueue failed\n");
  68. }
  69. //再入队
  70. ret=EnQueue(Q,8);
  71. if(ret){
  72. printf("EnQueu success\n");
  73. } else{
  74. printf("EnQueue failed\n");
  75. }
  76. return 0;
  77. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/707004
推荐阅读
相关标签
  

闽ICP备14008679号