美文网首页
自定义queue队列可变数据类型

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

作者: monkeyish | 来源:发表于2017-07-03 23:35 被阅读0次

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

    相关文章

      网友评论

          本文标题:自定义queue队列可变数据类型

          本文链接:https://www.haomeiwen.com/subject/ivzzcxtx.html