环形队列的实现原理

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

时间: 2024-09-30 19:03:59

环形队列的实现原理的相关文章

眉目传情之并发无锁环形队列的实现

眉目传情之并发无锁环形队列的实现 Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:October 10th, 2014 前面在<眉目传情之匠心独运的kfifo>一文中详细解析了 linux  内核并发无锁环形队列kfifo的原理和实现,kfifo鬼斧神工,博大精深,让人叹为观止,但遗憾的是kfifo为内核提供服务,并未开放出来.剑不试则利钝暗,弓不试则劲挠诬,鹰不试则巧拙惑,马不

环形缓冲区的设计及其在生产者消费者模式下的使用(并发有锁环形队列)

1.环形缓冲区 缓冲区的好处,就是空间换时间和协调快慢线程.缓冲区可以用很多设计法,这里说一下环形缓冲区的几种设计方案,可以看成是几种环形缓冲区的模式.设计环形缓冲区涉及到几个点,一是超出缓冲区大小的的索引如何处理,二是如何表示缓冲区满和缓冲区空,三是如何入队.出队,四是缓冲区中数据长度如何计算. ps.规定以下所有方案,在缓冲区满时不可再写入数据,缓冲区空时不能读数据 1.1.常规数组环形缓冲区 设缓冲区大小为N,队头out,队尾in,out.in均是下标表示: 初始时,in=out=0 队头

【转】环形队列理论

原文链接:http://blog.sina.com.cn/s/blog_8b200d440100xsug.html 环形队列是在实际编程极为有用的数据结构,它有如下特点. 它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单.能很快知道队列是否满为空.能以很快速度的来存取数据. 因为有简单高效的原因,甚至在硬件都实现了环形队列. 环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用程序大量交换数据,从硬件接收大量数据)均使用了环形队列. 一.环形队列实现原理 --

4、环形队列的实现(C语言)

一.实现原理如下图所示 环形队列实现需注意以下四点(本质上是和“3.一个简单队列的实现”一样的):(1)往队列中写数据 memcpy(&g_tQue[g_iWritePos],pNode,sizeof(T_QUEUE)); g_iWritePos = (g_iWritePos + 1) % QUEUE_SIZE_MAX; (2)从队列中读出数据 memcpy(pNode,&g_tQue[g_iReadPos],sizeof(T_QUEUE)); g_iReadPos = (g_iReadP

Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列

Atitit.提升软件稳定性---基于数据库实现的持久化  循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1. 用一个游标last 来指示 (指针表字段last ),麻烦的,不推荐 1 1.2. (简单,推荐)使用循环次数来指示,每循环加1   (字段cirTimes),order by cirtimes 1 4. 表格设计id, cirTimes,createtime,handlerID,recID,d

并发无锁之环形队列生产者消费者问题

1.生产者消费者问题 三种关系:生产者--生产者(互斥):消费者-消费者(互斥):生产者--消费者(互斥同步) 两个角色:生产者:消费者 一种生产场所:缓冲区 2.环形队列(缓冲区) 数据结构:可以有多种,这里选用数组,逻辑上将a[0]和a[size-1]相连构成环形队列 判断空/判断满:当读指针和写指针指向同一个区域为空,或者满(但不能区分空或者满) 两种方案:1.即尾结点与首结点之间至少留有一个元素的空间. 2. 添加一个计数器(信号量就是计数器所以这里用信号量完成计数器的功能) 3.sem

java实现数据结构中的环形队列

最近在看数据结构,队列在数据结构中是个重要的元素. 定义:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 队列主要分为普通队列和环形队列,环形队列比普通队列的使用效率更高(普通队列容易造成内存的浪费,时间效率也会降低,主要体现在队列的删除操作上) 下面用java来实现队列,仅供参考 package demo; //环形队列 public class QueueDemo { //创建队列 public QueueDemo(int num){ m_iQueueCapacity=num;

&lt;2014 05 16&gt; 线性表、栈与队列——一个环形队列的C语言实现

栈与队列都是具有特殊存取方式的线性表,栈属于先进后出(FILO),而队列则是先进先出(FIFO).栈能够将递归问题转化为非递归问题,这是它的一个重要特性.除了FILO.FIFO这样的最普遍存取方式外,还有一些扩展的数据结构,如双端队列.双栈.超队列.超栈等,它们是一种扩展与变异结构. 线性表有顺序存储和链接存储两类,这是针对计算机的线性存储空间作出的分类.前者可以是数组,后者可以是链表.字符串是线性表最常见的应用. 这里我用C语言实现了一个基于数组环形队列,它具有固定的队列空间.相比于链表实现,

顺序对列,环形队列,反向链式栈

1.顺序队列 #include<stdio.h> #include <stdlib.h> #define N 100 #define datatype int typedef struct queue { datatype data[N]; int rear;//吃东西 int front;//拉屎 } myQ ,*PmyQ; void init(PmyQ p); int isfull(PmyQ p); int isempty(PmyQ p); void show(PmyQ p);