环形队列的实现原理
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
原理:
内存上没有环形结构,因此环形队列利用数组的线性空间来实现。当数据到了尾部时,它将转回到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
相关文章推荐
- Linux中进程正常退出return和exit()的区别
- 浅谈文件描述符与文件指针
- 浅谈inode
- Swift中的闭包(Closure) 浅析
- 小工具: 听例句背单词
- printf()的返回值
- 实现动态顺序表
- 有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
- 判断回文数、回文字符串(从左边读和从右边读一样)
- 使用可变参数列表实现print("s\tc\n","bit-tech",'w');
- 使用可变参数列表实现任意个数求平均值
- hibernate.cfg.xml配置
- 编写程序实现strlen()函数,strcmp(),strcpy(),strcat()的功能
- util 将bean 独立出来 写法
- 编写一个程序统计输入字符串中: 各个数字、空白字符、以及其他所有字符出现的次数
- 实现一个函数int my_atoi(char s[]),可以将一个字符串转换为对应的整数
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
- 不使用(a+b)/2这种方式,求两个数的平均值(保证不会溢出)
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?(异或的用法)
- 猴子吃桃