数据结构 队列

实现队列的方法很多,比如动态数组、链表,今天主要介绍循环队列

首先说用静态数组实现简单队列。

31094354_O6pX.jpg

很显然,当队列满后,即便全部元素都出队,队列还是满的状态。这种情况就叫做“假溢出”,即数组中明明有可用空间,但却无法使用。

这是由定长数组的特性决定的。但我们可用改变一下思路,当队尾指针指向数组最后一个位置时,如果再有数据入队,并且队头指针没有指向数组的第一个元素,那么就让队为指针绕回到数组头部。这样就形成了一个逻辑上的环。

31094355_5EUH.jpg

这样,只要队列中实际的元素数量小于数组长度减一,就可以继续入队了。

其实这是一个非常简单的数据结构,难点就是判断队空、对满,以及计算队列长度。

131094355_16QR.jpgconst int MAX_QUEUE_SIZE = 5;
231094355_mJKi.jpgtemplate<typename T>
331094355_iq7F.jpgclass cyc_queue
431094355_nwdQ.jpg31094355_Evuo.jpg{
531094355_MkCX.jpgpublic:
631094355_4eSb.jpg     cyc_queue()
731094355_JakF.jpg         :m_nHead(0),
831094355_2ji1.jpg         m_nTail(0)
931094355_IXNT.jpg31094355_7Xgg.jpg    {}
1031094355_1fzt.jpg
1131094355_rOFz.jpg
1231094355_JSc4.jpg    //如对操作, 将数据追加到队列头部,并改变队首指针,如队成功,则返回true
1331094356_v4D2.jpg    bool in_queue(const T & data)
1431094356_jCW4.jpg31094356_DuOs.jpg    {
1531094356_mrqX.jpg        if(full())
1631094356_xLp3.jpg        //队列满
1731094356_N8P4.jpg31094356_acot.jpg        {
1831094356_Rfam.jpg            return false;
1931094356_xzUw.jpg         }
2031094356_FZCH.jpg
2131094356_XiA2.jpg         m_array[m_nTail] = data;
2231094356_YMzP.jpg         m_nTail = (m_nTail + 1) % MAX_QUEUE_SIZE;
2331094356_q09m.jpg     }
2431094356_FvQE.jpg
2531094357_4n7M.jpg    //出队操作,将队首数据复制并返回,改变队首指针
2631094357_PSS2.jpg     T out_queue()
2731094357_2CnB.jpg31094357_r4Vh.jpg    {
2831094357_d0gR.jpg        if(empty())
2931094357_IDwd.jpg31094357_u2zr.jpg        {
3031094357_CQrr.jpg            throw("队列已空");
3131094357_Ta4B.jpg         }
3231094357_UkPY.jpg        
3331094357_wIvs.jpg         T temp = m_array[m_nHead];
3431094357_EBEt.jpg         m_nHead = (m_nHead + 1) % MAX_QUEUE_SIZE;
3531094357_yMKs.jpg        return temp;
3631094357_4LQY.jpg     }
3731094357_gB56.jpg
3831094357_J9aU.jpg    bool empty()
3931094358_PwlO.jpg31094358_EoCz.jpg    {
4031094358_RwDE.jpg
4131094358_pHug.jpg        return m_nTail == m_nHead;
4231094358_ZKIP.jpg     }
4331094358_OEky.jpg
4431094358_ClAm.jpg    bool full()
4531094358_DIUA.jpg31094358_rqt0.jpg    {
4631094358_px8N.jpg        return (m_nTail + 1) % MAX_QUEUE_SIZE == m_nHead;
4731094358_kgcY.jpg     }
4831094358_AaXm.jpg
4931094358_WkLv.jpg     size_t size()
5031094358_iSli.jpg    {
5131094358_ozHe.jpg        return (m_nTail - m_nHead + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
5231094359_FgF9.jpg     }
5331094359_h5th.jpgprivate:
5431094359_RymC.jpg     T m_array[MAX_QUEUE_SIZE];
5531094359_yCyJ.jpg    int m_nHead;
5631094359_jhjV.jpg    int m_nTail;
5731094359_2Dc2.jpg};


转载于:https://my.oschina.net/u/1464678/blog/214539

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值