/*
* @FilePath : queue.c
* @Description : 循环队列的实现
* @Author : Songshuai
* @Date : 2024-08-08 15:14:13
* @Copyright (c) 2024 by Songshuai(Songshuai223@gmail.com), All Rights Reserved.
*
* @History record
* version date auther changes
* V0.1.0 2024-08-08 Songshuai Create
*/
#include "queue.h"
#include <stdlib.h> // for NULL
#include <string.h> // for memset mem..
/**
* @fn RingQueueInit
* @brief 循环队列初始化
* @param queue 队列首地址
* @return none
* @exception none
*/
void RingQueueInit(RingQueue_t *queue)
{
/* 队列为空 */
if (NULL == queue)
return;
/* 将队头队尾置为-1 */
queue->front = -1;
queue->rear = -1;
memset(queue->data, 0, sizeof(queue->data));
}
/**
* @fn RingQueuePush
* @brief 循环队列入队操作
* @param queue 队列首地址
* @param data 入队数据的首地址
* @param data_len 入队数据的长度
* @return true 入队操作成功 false 入队操作失败
* @exception 本函数未进行输入参数有效行校验,需要调用者自行保证其有效性,如果有无效参数,则可能导致操作失败,甚至出现core dump异常。
*/
bool RingQueuePush(RingQueue_t *queue, uint8_t *data, uint16_t data_len)
{
/* 局部变量初始化 */
QueueData_t *t_queue_data = NULL;
/* 判断队列是否已满 */
if (((queue->front == 0) && (queue->rear == ((int32_t)QUEUE_CAPACITY - 1))) || (queue->front == (queue->rear + 1)))
{
/* NOTE 可根据实际情况进行逻辑调整,比如阻塞等待、替换队头数据。。。。。 */
return false;
}
else
{
/* 队头为初始化值 */
if (queue->front <= -1)
{
/* 将队头队尾指向队列第一个位置 */
queue->rear = 0;
queue->front = 0;
}
/* 队尾达到最大值 且 队头还有空余 */
else if ((queue->rear == ((int32_t)QUEUE_CAPACITY - 1)) && (queue->front > 0))
{
/* 队尾指向队列第一个位置 */
queue->rear = 0;
}
else
{
/* 队尾指向下一个位置 */
queue->rear++;
}
/* 记录队尾位置 */
t_queue_data = &(queue->data[queue->rear]);
/* 清空当前队尾所在位置的数据 */
memset(t_queue_data->buffer, 0U, QUEUE_BUFFER_MAX);
/* 将传入的数据拷到队尾所在位置 */
memcpy(t_queue_data->buffer, data, data_len);
/* 保存数据长度 */
t_queue_data->length = data_len;
}
/* 返回结果 */
return true;
}
/**
* @fn RingQueuePop
* @brief 循环队列出队操作
* @param queue 队列首地址
* @return 若出队成功:则出队数据的首地址 若出队失败:则返回NULL
* @exception 本函数未进行输入参数有效行校验,需要调用者自行保证其有效性,如果有无效参数,则可能导致操作失败,甚至出现core dump异常。
*/
QueueData_t *RingQueuePop(RingQueue_t *queue)
{
/* 局部变量初始化 */
QueueData_t *t_queue_data = NULL;
/** 队列为空 */
if (queue->front <= -1)
{
/* NOTE 可根据实际情况进行逻辑调整,比如阻塞等待。。。。。 */
/* 本例中无处理 */
}
else
{
/* 获取队头位置的数据 */
t_queue_data = &(queue->data[queue->front]);
/* 队头队尾指向同一位置 */
if (queue->front == queue->rear)
{
/* 表明仅剩1个元素,将队头队尾初始化 */
queue->front = -1;
queue->rear = -1;
}
else
{
/* 队头达到最大值*/
if (queue->front == ((int32_t)QUEUE_CAPACITY - 1))
{
/* 将队头从新指向队列第1个位置 */
queue->front = 0;
}
else
{
/* 队头后移 */
queue->front = queue->front + 1;
}
}
}
/* 返回出队数据 */
return t_queue_data;
}
/**
* @fn RingQueueIsFull
* @brief 循环队列是否已满
* @param queue 队列首地址
* @return true 已满 false 未满
* @exception 如果输入参数无效(为NULL),则同样输出为已满(true)
*/
bool RingQueueIsFull(const RingQueue_t *queue)
{
/* 初始化局部变量 */
bool t_return_bool = false;
/* 指针有效 */
if (NULL == queue)
t_return_bool = true;
/* 队头指向第1个位置且队尾指向最后1个位置,或者队头队尾指向同一个位置 */
if (((queue->front == 0) && (queue->rear == ((int32_t)QUEUE_CAPACITY - 1))) || (queue->front == (queue->rear + 1)))
{
t_return_bool = true;
}
/* 返回结果 */
return t_return_bool;
}
/**
* @fn RingQueueIsEmpty
* @brief 判断队列是否为空
* @param queue 队列首地址
* @return true 为空 false 未空
* @exception 如果输入参数无效(为NULL),则同样输出为已空(true)
*/
bool RingQueueIsEmpty(const RingQueue_t *queue)
{
/* 初始化局部变量 */
bool t_return_bool = false;
/* 指针不为空 */
if (NULL == queue)
t_return_bool = true;
/* 队头为初始值 */
if (queue->front == -1)
/* 置返回值为TRUE */
t_return_bool = true;
/* 返回结果值 */
return t_return_bool;
}
/**
* @fn RingQueueUsedSize
* @brief 循环队列使用空间
* @param queue 队列首地址
* @return >= 0 已经使用的空间; < 0 参数异常
* @exception none
*/
int32_t RingQueueUsedSize(const RingQueue_t *queue)
{
/* 初始化局部变量 */
int32_t t_return_value = -1;
/* 指针有效 */
if (NULL == queue)
t_return_value = -1;
if (queue->front <= -1)
{
t_return_value = 0;
}
else if (queue->rear >= queue->front)
{
t_return_value = queue->rear - queue->front + 1;
}
else if (queue->rear < queue->front)
{
t_return_value = (int32_t)QUEUE_CAPACITY - (queue->front - queue->rear);
}
/* 返回结果 */
return t_return_value;
}
青椒*^_^*凤爪爪
- 粉丝: 2w+
- 资源: 18
最新资源
- jdk - 22.0.2 - windows graalVM
- jdk - 22.0.2 - windows
- 496785224932493FLUENT_VOF&熔化_2D (不含仿真数据).zip
- jdk - 22.0.2 - macos
- 在Windows系统中管理Mac磁盘的实用工具-在Windows系统中创建并使用Mac磁盘,读取Mac磁盘中的文件
- PFC理论基础与Matlab仿真模型学习笔记(1)-PFC电路概述
- 吞食天地2马腾传.nes
- 西部数据发布的一款西数硬盘检测修复工具-支持WD-L/WD-ROYL板,能进行硬盘软复位,可识别硬盘查看或清除-供大家学习参考
- wwwwwwwwwwwwwwwwwww
- 利用恒源云在云端租用GPU服务器训练YOLOv8模型(包括Linux系统命令讲解)_恒源云跑模型-CSDN博客.html
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈