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