为了账号安全,请及时绑定邮箱和手机立即绑定

出队想不明白!请大佬指导一下。

https://img1.sycdn.imooc.com//5c683e8700013ebc07410518.jpg


第一处:参数为甚么要引用?(首地址?但elment是输入赋值,对他引用是哪里的首地址?)

第二处:element = m_pQueue[m_iHead],这样,对头给了element,m_pQueue[m_iHead]的值怎么就实现了删除吧?

正在回答

3 回答

【1】首先解释一下参数为什么要用引用类型?

首先不用参数,直接申明函数如下:

bool DeQueue( ); // return bool 类型,判断出队列操作是否成功,但是不会返回被移出队列的数值

那么,传入引用类型的参数呢?

bool DeQueue(int& element);

除了return的返回值可以判断操作是否成功外,我们还可以拿到当前被移出队列的数

【2】element = m_pQueue[m_iHead],这样,对头给了element,m_pQueue[m_iHead]的值怎么就实现了删除吧?

element = m_pQueue[m_iHead] ;// 只是将m_pQueue数组中的m_iHead下标(这儿也是队列头)的数值给了element变量,这样引用类型的传参可以获取到当前被移出队列的数值。

             m_iHead++; // 头后移动一位
            m_iQueueLen--; // 长度减去一位

这两句才是真正实现了删除的功能。

0 回复 有任何疑惑可以回复我~

多谢你

0 回复 有任何疑惑可以回复我~
#1

qq_超越_21

我觉得这里用引用不是多余的,如果你在外部需要用到出队的那个值,就应该传引用或者指针来保存这个出队的值
2019-02-25 回复 有任何疑惑可以回复我~

第一处:传参采用引不引用效果一样,老师这里是p->Dequeue(XXX);把队首原先的值的赋值给传进来的参数element,只是赋值给它,(先把队首元素赋值给element,再队首后移一位,为什么老师要把原来队首的值进行赋值给别人,队首再后移,我个人觉得多余)后面并没有用到,其实也可以这样写:

bool Dequeue()//出队
    {
        if(QueueEmpty())
        {
            return false;
        }
        else
        {
            m_iHead++;
            m_iHead=m_iHead%m_iQueueCapacity;
            m_iQueueLen--;
            return true;
        }
    }

第二处:通过m_iHead++;指针后移,相当于队首元素m_pQueue[m_iHead]后移一位,m_iQueueLen--;(长度也缩短一位),理解为队首后移一位(而不是删除了,那个位置就还是存在的,也符合环形队列的特点)


纯个人理解,用词不是很专业,有点啰嗦,希望帮你更好理解。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

出队想不明白!请大佬指导一下。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信