循环队列及C语言实现<二>

这篇博文是循环队列实现的进阶篇,提供了更完善的C语言操作接口。通过剩余空间变量space判断队列状态,优化了写缓冲区和读缓冲区的处理,确保在缓冲区边界处正确处理数据和读写位置。代码实现方便在高速USB设备驱动和网络抓包缓存等场景使用。
摘要由CSDN通过智能技术生成

  在我的上一篇博文中已经讲到循环队列的特点作用以及C语言实现,当然实现和操作的方式比较简单,在实际项目应用中略显粗糙。因此,这一篇提供一个进阶篇的实现与操作接口。具体函数作用可以参见我的注释部分,使用的时候直接把里面的接口函数放在一个头文件里面直接调用就可以啦,十分方便易用,但是可以实现的功能不可小觑哦,比如我在写高速USB设备驱动(20MB/s)以及网络抓包缓存的时候用到的都是这个看似简单的数据结构,所以还没有熟练运用的要加把劲了。需要注意的地方包括:

<1> 不再利用上一篇中 “q->front = (q->rear + 1) % q->size” 的关系来进行队列空还是满的判断了,这次利用 space 剩余缓存空间大小来判断。

<2> 写缓冲区的时候,要进行缓冲区剩余空间大小 space 的判断,如果要写入空间小于等于剩余空间,那么就可以将数据完全写入缓冲区,此时写入长度等于要写入的数据长度,否则只能将部分数据写入缓冲区,返回长度就等于剩余空间大小了。

<3> 读缓冲区同理,要进行当前缓冲区中可用缓存的大小的判断,也即已写入缓存大小的判断。若要读出的数据长度小于已写入缓存,那么返回长度为希望读出的数据长度,否则为已写入缓存的长度。

<4> 在写入和读出的时候尤其需要注意到达缓冲区边界的时候,数据和读写位置的处理。如果读写到了边界,那么就要分两次读取了,另外读写位置一定不能超越分配的缓冲区边界,所以在循环队列中数据的读写位置前移的时候都要对缓冲区长度取余以保证数据操作的安全性。

  下面就是代码部分了,若有不明或不妥之处,可以直接 send comments to me :-D

/*
 * Queue operation API - 1.0
 *
 * Copyright (C) 2016 SoldierJazz (SoldierJazz@163.com)
 *
 * This program is free software; you can redistribute it and/or
 * modify it. 
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
 * Queue - queue structure
 * @buf: queue buffer
 * @read: position of read
 * @write: position of write
 * @size: buffer size
 * @space: writable buffer size
 */
typedef struct {
    char *buf;
    unsigned int read;
    unsigned int write;
    unsigned int size;
    unsigned int space;
} Queue;

#define Avail(q) (q->size - q->space)

/**
 * Queue_Init - init a queue
 * @q: pointer of queue
 * @size: size of buffer in queue
 *
 * Must be called when started. 
 */
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值