c语言实现基本的队列功能,创建/清除队列,插入单个或多个字节,取出单个或多个字节,队列当前状态等等,源文件可直接在这里下载:
cqueue.h文件
#ifndef __CQUENE__
#define __CQUENE__
typedef unsigned int uint32_t;
typedef int int32_t;
typedef char int8_t;
typedef unsigned char uint8_t;
typedef short int16_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;
#define min(x,y) x>y?y:x
typedef struct{
uint8_t *fifo;
uint32_t rear;
uint32_t head;
uint32_t size;
}cqueue_t;
void cqueue_crete(cqueue_t *cqueue, uint8_t *buf, uint32_t size);
int cqueue_byte_push(cqueue_t *queue, uint8_t byte);
int cqueue_buf_push(cqueue_t *queue, uint8_t *buf, uint32_t len);
int cqueue_byte_pop(cqueue_t *queue, uint8_t &byte);
int cqueue_buf_pop(cqueue_t *queue, uint8_t *buf, uint32_t len);
int cqueue_size_remain(cqueue_t *queue);
int cqueue_size_used(cqueue_t *queue);
int cqueue_full_is(cqueue_t *queue);
void cqueue_flush(cqueue_t *queue);
#endif
cqueue.c文件
/*
* 功能:队列
* 作者:牛哥哥
* 日期:2018.11.03
* 地点:于深圳创业花园
*/
#include "cqueue.h"
#include "string.h"
void cqueue_crete(cqueue_t *queue, uint8_t *buf, uint32_t size)
{
queue->fifo = buf;
queue->head = 0;
queue->rear = 0;
queue->size = size;
}
int cqueue_byte_push(cqueue_t *queue, uint8_t byte)
{
if ((queue->rear + 1) % queue->size != queue->head){
queue->fifo[queue->rear++] = byte;
queue->rear %= queue->size;
}
else{
return 0;
}
return 1;
}
int cqueue_buf_push(cqueue_t *queue, uint8_t *buf, uint32_t len)
{
uint32_t empty, rear_rem;
empty = (queue->head - queue->rear - 1 + queue->size)%queue->size;
empty = min(empty, len);
if (queue->rear < queue->head){
memcpy(&queue->fifo[queue->rear], buf, empty);
}
else{
rear_rem = queue->size - queue->rear;
if (empty <= rear_rem){
memcpy(&queue->fifo[queue->rear], buf, empty);
}
else{
memcpy(&queue->fifo[queue->rear], buf, rear_rem);
memcpy(queue->fifo, &buf[rear_rem], empty - rear_rem);
}
}
queue->rear += empty;
queue->rear %= queue->size;
return empty;
}
int cqueue_byte_pop(cqueue_t *queue, uint8_t &byte)
{
if (queue->head != queue->rear){
byte = queue->fifo[queue->head++];
queue->head %= queue->size;
}
else{
return 0;
}
return 1;
}
int cqueue_buf_pop(cqueue_t *queue, uint8_t *buf, uint32_t len)
{
uint32_t used, rear_used;
used = (queue->rear - queue->head + queue->size) % queue->size;
used = min(used, len);
if (queue->head <= queue->rear){
memcpy(buf, &queue->fifo[queue->head], used);
}
else{
rear_used = queue->size - queue->head;
if (used <= rear_used){
memcpy(buf, &queue->fifo[queue->head], used);
}
else{
memcpy(buf, &queue->fifo[queue->head], rear_used);
memcpy(&buf[rear_used], queue->fifo, used - rear_used);
}
}
queue->head += used;
queue->head %= queue->size;
return used;
}
int cqueue_size_remain(cqueue_t *queue)
{
return((queue->head - queue->rear - 1 + queue->size)%queue->size);
}
int cqueue_size_used(cqueue_t *queue)
{
return((queue->rear - queue->head + queue->size)%queue->size);
}
int cqueue_full_is(cqueue_t *queue)
{
return((queue->rear+1)%queue->size == queue->head);
}
void cqueue_flush(cqueue_t *queue)
{
queue->head = 0;
queue->rear = 0;
memset(queue->fifo, 0, queue->size);
}