循环队列设计解读

        循环队列可以用顺序表实现也可以用链表实现,这里我们用顺序表实现。这里我就用顺序表来实现,我们用front和back表实数组下标,sz表实我们开辟的循环队列的大小(后面判断循环是否满了需要用到)

        然后用myCircularQueueCreate函数来创建一个循环队列,由于是在函数内开辟的队列,我们就不能用普通的创建,要malloc申请空间,在堆上存放循环队列。

        循环队列的大小,就由我们传输进来的值来确定,但要注意:我们要开辟k+1个空间,用于计算循环队列是否满了的问题。

        如下图所示,当没有队列内没有元素时,front=back,每存放一个数据,back后移一位。直到队列只剩一个空间时,就代表循环队列满了。

        循环队列满了的如果用代码表示,就为:(back+1)%sz==front;这里的sz我们存放的是k+1,有会认为直接back%k就行了,不需要这么麻烦,但是数据如果不是下图这样头对头,尾对尾的情况呢?

        如下图所示,这时就不能用back%k得到循环队列满了的条件了,必须用(back+1)%(k+1)==front来判断,也就是(back+1)%sz==front。

        最重要的开辟部分已经结束,接下来就是队列的增加和删除了。

        增加数据时,我们只需要考虑两点:1、循环队列是否已满。2、back是否走到了最后的位置。如果循环队列满了,我们就不再执行后续代码,返回false。如果back走到了最后,我们就需要存放完数据后,给让back从0开始(第一步没有返回false则说明还有位置)

        删除数据时,也要考虑两点:1、循环队列是否为空,为空的条件判断就为:front==back。2、删除数据时,front是否走到了队列最后的位置,如果走到了,就让front置零返回头部。

        接着容易出现错误的点时返回对尾数据,返回对尾数据时,由于我们定义的back是在最后一个元素的后面,所以我们要返回back-1位置的数据,但是back-1是有可能造成数组越界的(就是back=0时),所以要分类讨论。

        返回队头、判空、队列是否满了、销毁队列就比较容易实现了。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值