环形队列是一个首尾相连的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)