最近需要使用一款嵌入式硬件,不支持g++,仅仅支持gcc,所以STL模板类不能使用,基于此队列需要自己实现,废话少说直接上源代码和使用方式
1、队列代码部分:
①:接口定义:
#pragma once
#include <stdbool.h>
#include <stddef.h>
//#include "core_uart.h"
typedef core_protocol_message queueElementT; /* core_protocol_message 是我自定义的一个数据类型,可以是int char 或者其他结构体 */
typedef struct queueCDT * __queueADT_DCB; /* 队列的指针 */
__queueADT_DCB newQueue(void); /* 生成队列的内存区域 使用malloc生成 */
void freeQueue(__queueADT_DCB queue); /* 释放掉队列的内存区域 使用free */
bool inQueue(__queueADT_DCB queue, queueElementT value); /* 消息入队 */
bool outQueue(__queueADT_DCB queue, queueElementT *p_alue); /* 消息出队 */
bool queueIsEmpty(__queueADT_DCB queue); /* 判断消息是否为空 */
bool queueIsFull(__queueADT_DCB queue); /* 判断消息是否已经满 */
int getQueueLength(__queueADT_DCB queue); /* 获取队列中数据的长度 */
②:接口实现:
#include "__Queue_zhan.h"
#include <malloc.h>
#define MAXQSIZE 100 /* 定义队列的个数 */
struct queueCDT{
queueElementT *data; /* 数据 */
int front; /* 队列的头部 */
int rear; /* 队列的尾部 */
};
//typedef struct queueCDT * __queueADT_DCB;
__queueADT_DCB newQueue(void)
{
__queueADT_DCB queue;
queue = (__queueADT_DCB)malloc(sizeof(struct queueCDT));
queue -> data = (queueElementT*)malloc(MAXQSIZE * sizeof(queueElementT));
queue -> front = 0;
queue -> rear = 0;
return queue;
}
void freeQueue(__queueADT_DCB queue)
{
free(queue -> data);
free(queue);
}
bool inQueue(__queueADT_DCB queue, queueElementT value)
{
if(queueIsFull(queue)) {
return false;
}
queue -> data[queue -> rear] = value;
queue -> rear = (queue->rear + 1) % MAXQSIZE;
return true;
}
bool outQueue(__queueADT_DCB queue, queueElementT *p_value)
{
if(queueIsEmpty(queue)) {
return false;
}
*p_value = queue -> data[queue -> front];
queue -> front = (queue -> front + 1) % MAXQSIZE;
return true;
}
bool queueIsEmpty(__queueADT_DCB queue)
{
return (queue -> rear == queue -> front);
}
bool queueIsFull(__queueADT_DCB queue)
{
return ((queue->rear + 1) % MAXQSIZE == queue -> front);
}
int getQueueLength(__queueADT_DCB queue)
{
return (((queue -> rear) - (queue -> front)) + MAXQSIZE) % MAXQSIZE;
}
2、队列使用部分:
int main(void)
{
core_protocol_message DCB_UART_data; /* 串口原始数据数据 发送使用 */
__queueADT_DCB dcb_uart_queue; /* 四个串口队列 接收中入队 */
dcb_uart_queue = newQueue(); /* 生成串口数据队列 */
for(i=0;i<90;i++)
{
DCB_UART_data[0].ucCtrl = i;
DCB_UART_data[0].ucLenght = i;
DCB_UART_data[0].pucdate[0] = 222;
inQueue(dcb_uart_queue[0], DCB_UART_data[0]); /* 数据入队 */
}
for(;;)
{
if( queueIsEmpty(dcb_uart_queue) == false ) /* 判断数据是否为空 */
{
outQueue(dcb_uart_queue[0],&dcb_uart_message); /* 数据出队 */
printf("1 %d %d %d \r\n",dcb_uart_message.ucCtrl,dcb_uart_message.ucLenght,dcb_uart_message.pucdate[0]);
usleep(1000);
continue;
}
else
{
usleep(10000);
continue;
}
}
freeQueue(dcb_uart_queue); /* 释放队列消息 */
return 0;
}
3、总结:
①:直接开辟出一片数据存储区,占用堆资源,后续可以改进为链式存储结构,动态生成和释放空间
②:数据类型固定,不能灵活调整数据类型,没有STL模板类中方便