静态环形队列(C语言)

本文介绍静态环形队列的实现原理及C语言代码示例。详细解释了如何通过写入计数与读取计数判断队列是否为空或满,并演示了一组数据的写入与读出过程。

说明:

1.静态环形队列就是长度已提前确定,可以按顺序循环写入数据(0、1、2...9、0、1、2...);可以按顺序循环读取数据(0、1、2...9、0、1、2...);通过write记录写入个数,写一次加1;通过Read记录读取的个数,读一次加1;

2.队列满:计数其实隐性代表了数据的位置,如果下一个要写入的计数等于读取计数“Read == ((Write + 1”)说明写入已满,(比如:一个圆形跑道上有均匀10个固定的位置可以放东西或者取东西,两个人在圆形跑道上同向追赶,一个前面放东西一个后边取东西,放东西的那个人将要放下一个东西的位置恰好是取东西的那个人正准备取下一个东西的位置,也就是放东西的人已放满一圈了)

3.队列空:计数Read == Write,说明队列空

typedef struct                                     //数据内容根据实际可以随意变更
{
	int a;
	int b;
	int c;
	char str[100];
}DataDef



#define BUFFER_LEN 10                                //环形队列长度
static int Read  = 0;                                //读计数
static int Write = 0;                                //写计数
static DataDef DataBuff[BUFFER_LEN];                 //环形队列


static int BufferFull(void)                          //环形队列满
{
	return (Read == ((Write + 1) % BUFFER_LEN));
}

static int BufferEmpty(void)                         //环形队列空
{
	return (Read == Write);
}

static void PutDataToBuffer(DataDef *data)           //一组数据写入队列
{
	if (!BufferFull())
	{
		DataBuff[Write] = *data;
		Write = (Write + 1) % BUFFER_LEN;
	}
}


static int GetDataFromBuffer(DataDef *data)         //从队列读出一组数据
{
	if (!BufferEmpty())
	{
		*data= DataBuff[Read];
		Read = (Read + 1) % BUFFER_LEN;
		return 1;
	}
	else
	{
		return 0;
	}
}

分析两个函数,不管是PutDataToBuffer 还是GetDataFromBuffer函数,其实都只修改了一个全局变量,另一个全局变量只作为读取操作,所以即使Read和Write在两个任务中使用也并不需要加锁。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值