问答详情
源自:4-3 环形队列检测

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

https://img4.mukewang.com/5c683e8700013ebc07410518.jpg


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

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

提问者:慕运维3094527 2019-02-17 00:54
微课

个回答

  • 精慕门6399046
    2019-03-11 22:33:47

    【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--; // 长度减去一位

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

  • 慕运维3094527
    2019-02-17 18:25:12

    多谢你

  • 不吃辣的李叔叔
    2019-02-17 16:10:07

    第一处:传参采用引不引用效果一样,老师这里是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--;(长度也缩短一位),理解为队首后移一位(而不是删除了,那个位置就还是存在的,也符合环形队列的特点)


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