循环队列实现原理
2016-11-24 11:45
190 查看
环形队列是一个首尾相连的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)
原理:
内存上没有环形结构,因此环形队列利用数组的线性空间来实现。当数据到了尾部时,它将转回到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)
相关文章推荐
- HashMap的原理与实 无锁队列的实现Java HashMap的死循环 red black tree
- 一个支持多线程同步循环队列的实现
- 用循环数组实现队列
- 循环队列操作实现
- Java数组实现循环队列
- 多线程读取循环队列的实现
- 循环队列的实现(Queue, C++版)
- 简要分析Ogre的渲染队列实现原理(二)
- 利用循环数组实现的队列
- 链队列的C++ 实现以及循环队列
- 循环队列的一个简单实现
- [修正] Taglib原理和实现之循环的Tag
- 如何实现一个循环队列
- 如何实现一个循环队列
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- Taglib 原理和实现:第四章 循环的Tag
- 如何实现一个循环队列
- 循环队列的数组表示函数的实现
- 用VB实现循环队列算法收藏
- 简要分析Ogre渲染队列的实现原理(一)