【原创】【C语言】队列的用法

一、这是个什么玩意

队列就好比咱们排的队,排在头的人最先进过主席台,排在尾的最后进过主席台,一个词——先进先出,书面一点就是队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。一般用法在队头插入,在队尾删除。

记住,队列终究它就是个buf,buf就是存东西的,保存不丢失,可以理解为在buf上封装了一些操作。

二、有毛用啊

1、用于任务间通信,尤其对于单任务系统,多个任务都操作一个队列,比如,A任务往队列里扔数据,B任务负责检查队列,只要有数据就进行处理,起到了两个任务通信的效果,同样可以把这个数据理解为消息,A任务给B任务发消息,B任务根据不同的消息(数据)做不同的处理。

2、缓冲数据。最常见的就是串口接收数据,搞一个环形buf队列,收到数据就放到这个队列中,当然这个buf肯定是有长度的,不能一直存储数据。正常用法下,得及时读取走,这样就能一直接收数据不丢失。

三、怎么用啊

自己先写个队列的实现,就知道怎么用了

#include <stdio.h>
int queuebuffer[6]={0};
typedef struct _Tag_My_Queue_
{
    int *buffer;
    unsigned char In;
    unsigned char Out;
    int queueSize;
}my_queue;
void queueInit(my_queue *queue,int *buffer,int bufferSize)
{
    queue->buffer = buffer;
    queue->In = 0;
    queue->Out = 0;
    queue->queueSize = bufferSize;
}
//queue space numbers
int queue_space(my_queue *queue)
{
    int size =queue->queueSize;
    int num = queue->Out;
    while(num != queue->In)
    {
        size--;
        num = (num + 1)%queue->queueSize;
    }
    return size - 1;
}
//queue data numbers
int queue_deep(my_queue *queue)
{
    int size = 0;
    int num = queue->Out;
    while(num != queue->In)
    {
        size++;
        num = (num + 1)%queue->queueSize;
    }
    return size;
}
//1:empty.0:not empty
int queue_empty(my_queue *queue)
{
    return (queue->In == queue->Out)?1:0;
}
//1:full.0:not full
int queue_full(my_queue *queue)
{
    return ((queue->In + 1) % queue->queueSize == queue->Out)?1:0;
}
int addDataToQueue(my_queue *queue,int data)
{
    if(queue_full(queue))
    {
        printf("queue already full!!!\n");
        return 0;
    }
    queue->buffer[queue->In] = data;  
    queue->In = (queue->In + 1) % queue->queueSize;
    return 1;
}
int deleteDataFromQueue(my_queue *queue,int *data)
{
    if(queue_empty(queue))
    {
        printf("queue already empty!!!\n");
        return 0;
    }
    *data = queue->buffer[queue->Out];
    queue->Out = (queue->Out + 1) % queue->queueSize;
    return 1;
}
int queue_print(my_queue *queue)
{
    char num = 0;
    if(queue_empty(queue))
    {
        printf("queue already empty!!!\n");
        return 0;
    }
    for(num = queue->Out;num != queue->In;num = (num + 1)%queue->queueSize)
    {
        printf("QueueValue[%d]:%d\n",num,queue->buffer[num]);
    }
    return 1;
}
void main()
{
    my_queue testqueue;
    int data;
    queueInit(&testqueue,queuebuffer,sizeof(queuebuffer)/sizeof(queuebuffer[0]));
    addDataToQueue(&testqueue,55);
    addDataToQueue(&testqueue,3);
    addDataToQueue(&testqueue,2);
    addDataToQueue(&testqueue,33);
    addDataToQueue(&testqueue,6);
    printf("---queue deep:%d\n",queue_deep(&testqueue));
    printf("---queue space:%d\n",queue_space(&testqueue));
    deleteDataFromQueue(&testqueue,&data);
    printf("data:%d\n",data);
    deleteDataFromQueue(&testqueue,&data);
    printf("data:%d\n",data);
    deleteDataFromQueue(&testqueue,&data);
    printf("data:%d\n",data);
    deleteDataFromQueue(&testqueue,&data);
    printf("data:%d\n",data);
    printf("---queue deep:%d\n",queue_deep(&testqueue));
    printf("---queue space:%d\n",queue_space(&testqueue));
    deleteDataFromQueue(&testqueue,&data);
    printf("data:%d\n",data);
    addDataToQueue(&testqueue,45);
    addDataToQueue(&testqueue,22);
    addDataToQueue(&testqueue,33);

    deleteDataFromQueue(&testqueue,&data);
    printf("data:%d\n",data);
    printf("data:%d\n",deleteDataFromQueue(&testqueue,&data));
    printf("---queue deep:%d\n",queue_deep(&testqueue));
    printf("---queue space:%d\n",queue_space(&testqueue));
    queue_print(&testqueue);
    printf("In:%d,Out:%d\n",testqueue.In,testqueue.Out);
    while(1);
}

四、成为大神的用法

1、串口接收用

2、单片机开发的时候,任务间通信用

3、待续




  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值