美文网首页
自定义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队列可变数据类型

    最近需要使用一款嵌入式硬件,不支持g++,仅仅支持gcc,所以STL模板类不能使用,基于此队列需要自己实现,废话少...

  • 2018-03-22 队列,栈

    队列queue #include 定义: queue<*> name '*'代表队列的数据类型,如:int,cha...

  • DispatchSource 之 add

    创建自定义队列 Queue , 将 source event handler 提交到 Queue 中去。sour...

  • GCD使用·记录

    一、开端 队列与任务创建 dispatch_queue_t 自定义GCD队列,区分串行队列与并行队列 dispat...

  • 循环队列的实现方法1

    设:队列长度是QUEUE_LENGTH队列数组是queue[QUEUE_LENGTH]队列头索引是head队列尾索...

  • GCD多线程同步-dispatch_barrier_async函

    使用 dispatch_barrier_async ,该函数只能搭配自定义并行队列 dispatch_queue_...

  • 栅栏函数

    需要用自定义并发队列 dispatch_barrier_sync(queue,void(^block)())会将q...

  • GCD学习笔记

    dispatch_queue_create GCD底层提供的自定义创建队列接口,创建时的逻辑比较简单,主要是队列必...

  • Java—Queue队列详解

    Queue Queue队列介绍   Queue是用于模拟队列的,啥叫队列?队列就是排队的意思,比如排队结账,先进入...

  • Java—Queue队列详解(Deque/PriorityQue

    Queue Queue队列介绍   Queue是用于模拟队列的,啥叫队列?队列就是排队的意思,比如排队结账,先进入...

网友评论

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

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