C语言实现队列功能

  c语言实现基本的队列功能,创建/清除队列,插入单个或多个字节,取出单个或多个字节,队列当前状态等等,源文件可直接在这里下载:

https://download.csdn.net/download/niu_88/10762984

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);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值