您的位置:首页 > 其它

环形队列的实现原理

2016-06-17 18:37 337 查看
环形队列是一个首尾相连的FIFO(命名管道)的数据结构,它采用数组的线性空间。它能很快知道队列是否为满或者为空,也能很快的存取数据。

原理:

内存上没有环形结构,因此环形队列利用数组的线性空间来实现。当数据到了尾部时,它将转回到0位置来处理。这个转回操作通过取模来执行。
构造:逻辑上,将数组q[0]与q[MAXN-1]相连接,形成一个存放队列的环形空间。
     用数组下标来标明队列的读、写位置。head 指向可以读的位置,tail 指向可以写的位置。

环形队列的关键是判断队列为空或者满。tail 追上 head——>满
                                  head 追上 tail——>空
判断方法:
      1.附加一个标志位 tag
                            tail 追上 head——>满——>令 tag=1
                            head 追上 tail——>空——>令 tag=0
             实现方法:
                            初始化状态:q ->head = q -> tail = q -> tag =0
                            队列为空:( q -> head == q -> tail ) && ( q -> tag ==0)
                            队列为满:( q -> head == q -> tail ) && ( q -> tag ==1)
                            入队: 如果队列不满,则写入:
                                               q -> tail = ( q -> tail +1) % ( q -> size )
                            出队:如果队列不为空,则从 head 处读出:
                                下一个可读位置: q -> head = ( q -> head +1) % ( q -> size)

      2.限制 tail 赶上 head ,即队尾节点与队首节点之间至少留有一个元素的空间(预留空间)
                                 head == tail ——>空
                                 ( tail +1 ) % MAXN == head——>满
             实现方法:
                             初始化状态: q -> head = q -> tail =0
                             队列为空: q -> head == q -> tail
                             队列为满: ( q -> tail + 1 ) % ( q -> size) == q -> head
                             入队:如果队列不满,则写入:
                                               q -> tail = ( q -> tail +1) % ( q -> size )
                             出队:如果队列不为空,则从 head 处读出:
                                下一个可读位置: q -> head = ( q -> head +1) % ( q -> size)

本文出自 “追寻内心的声音” 博客,请务必保留此出处http://ljy789.blog.51cto.com/10697684/1762100
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: