自定义queue队列可变数据类型

2017-07-03  本文已影响0人  monkeyish

最近需要使用一款嵌入式硬件,不支持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模板类中方便

上一篇下一篇

猜你喜欢

热点阅读