最近需要使用一款嵌入式硬件李皇,不支持g++温学,僅僅支持gcc,所以STL模板類不能使用钙畔,基于此隊(duì)列需要自己實(shí)現(xiàn)茫陆,廢話少說直接上源代碼和使用方式
1、隊(duì)列代碼部分:
①:接口定義:
#pragma once
#include <stdbool.h>
#include <stddef.h>
//#include "core_uart.h"
typedef core_protocol_message queueElementT; /* core_protocol_message 是我自定義的一個(gè)數(shù)據(jù)類型擎析,可以是int char 或者其他結(jié)構(gòu)體 */
typedef struct queueCDT * __queueADT_DCB; /* 隊(duì)列的指針 */
__queueADT_DCB newQueue(void); /* 生成隊(duì)列的內(nèi)存區(qū)域 使用malloc生成 */
void freeQueue(__queueADT_DCB queue); /* 釋放掉隊(duì)列的內(nèi)存區(qū)域 使用free */
bool inQueue(__queueADT_DCB queue, queueElementT value); /* 消息入隊(duì) */
bool outQueue(__queueADT_DCB queue, queueElementT *p_alue); /* 消息出隊(duì) */
bool queueIsEmpty(__queueADT_DCB queue); /* 判斷消息是否為空 */
bool queueIsFull(__queueADT_DCB queue); /* 判斷消息是否已經(jīng)滿 */
int getQueueLength(__queueADT_DCB queue); /* 獲取隊(duì)列中數(shù)據(jù)的長(zhǎng)度 */
②:接口實(shí)現(xiàn):
#include "__Queue_zhan.h"
#include <malloc.h>
#define MAXQSIZE 100 /* 定義隊(duì)列的個(gè)數(shù) */
struct queueCDT{
queueElementT *data; /* 數(shù)據(jù) */
int front; /* 隊(duì)列的頭部 */
int rear; /* 隊(duì)列的尾部 */
};
//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簿盅、隊(duì)列使用部分:
int main(void)
{
core_protocol_message DCB_UART_data; /* 串口原始數(shù)據(jù)數(shù)據(jù) 發(fā)送使用 */
__queueADT_DCB dcb_uart_queue; /* 四個(gè)串口隊(duì)列 接收中入隊(duì) */
dcb_uart_queue = newQueue(); /* 生成串口數(shù)據(jù)隊(duì)列 */
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]); /* 數(shù)據(jù)入隊(duì) */
}
for(;;)
{
if( queueIsEmpty(dcb_uart_queue) == false ) /* 判斷數(shù)據(jù)是否為空 */
{
outQueue(dcb_uart_queue[0],&dcb_uart_message); /* 數(shù)據(jù)出隊(duì) */
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); /* 釋放隊(duì)列消息 */
return 0;
}
3、總結(jié):
①:直接開辟出一片數(shù)據(jù)存儲(chǔ)區(qū),占用堆資源挪鹏,后續(xù)可以改進(jìn)為鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)见秽,動(dòng)態(tài)生成和釋放空間
②:數(shù)據(jù)類型固定,不能靈活調(diào)整數(shù)據(jù)類型讨盒,沒有STL模板類中方便