c语言-队列

什么是队列:

队列和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。与栈结构不

同的是,队列的两端都"开口",要求数据只能从一端进,从另一端出。

队列的特点:

队列是一种特殊的“一对一关系”的线性表,要求“一端存数据,另一端取数据”,并且遵循“先进先出”原则的线性存储结构。

队列顺序存储:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define  MAX 1000

//队列的结构体
typedef struct Queue
{
    int data[MAX];   //队列内部真实的结构、数组模拟
    int size;        //队列的大小
}Queue,*seqQueue;

//初始化队列
seqQueue init_seqQueue()
{
    //分配内存空间
    seqQueue queue = malloc(sizeof(struct Queue));

    if (queue == NULL)
    {
        return NULL;
    }

    //初始化队列大小
    queue->size = 0;

    //清空队列中所有元素
    for (int i = 0; i < MAX;i++)
    {
        queue->data[i] = 0;
    }

    return queue;
}

//入队
void push_seqQueue(seqQueue queue, int data)
{
    //本质 -- 尾插
    if (queue == NULL)
    {
        return;
    }

    if (queue->size == MAX)
    {
        printf("队列已满\n");
        return;
    }

    queue->data[queue->size] = data;
    //更新队列大小
    queue->size++;
}
//出队
void pop_seqQueue(seqQueue queue)
{
    //本质  头删
    if (queue == NULL)
    {
        return;
    }
    if (queue->size == 0)
    {
        printf("空队,无法出队\n");
        return;
    }

    for (int i = 0; i < queue->size - 1; i++)
    {
        queue->data[i] = queue->data[i + 1];
    }

    //更新数组大小
    queue->size--;
}


//返回队头
int front_seqQueue(seqQueue queue)
{
    if (queue == NULL)
    {
        return -1;
    }
    return queue->data[0];
}

//返回队尾
int back_seqQueue(seqQueue queue)
{
    if (queue == NULL)
    {
        return -1;
    }
    
    return queue->data[queue->size - 1];
}

//队列大小
int size_seqQueue(seqQueue queue)
{
    if (queue == NULL)
    {
        return -1;
    }
    return queue->size;
}

//判断是否为空
int isEmpty_seqQueue(seqQueue queue)
{
    if (queue == NULL)
    {
        return -1;
    }
    if (queue->size == 0)
    {
        return 1;
    }
    return 0;
}

//销毁队列
void destroy_seqQueue(seqQueue queue)
{
    if (queue != NULL)
    {
        free(queue);
        queue = NULL;
    }
}

队列的链式存储:

入队:
出队:

队列链式存储:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//结点结构体
struct Node
{
    int data;            //数据域
    struct Node* next;  //指针域
};

//队列的结构体
typedef struct LQueue
{
    struct Node header; //头结点
    int size;  //队列大小
    struct Node* pTail; //尾结点指针
}LQueue, *LinkQueue;


//初始化队列
LinkQueue init_LinkQueue()
{
    //创建队列结构体
    struct LQueue* myQueue = (struct LQueue*)malloc(sizeof(struct LQueue));
    if (myQueue == NULL)
    {
        return NULL;
    }

    //初始化队列
    myQueue->size = 0;
    myQueue->header.next = NULL;
    myQueue->pTail = &myQueue->header;

    return myQueue;
}

//入队
void push_LinkQueue(LinkQueue queue, int data)
{
    //本质 尾插
    if (queue == NULL)
    {
        return;
    }

    //新结点
    struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
    if (!newNode)
    {
        return;
    }
    newNode->data = data;

    //更新指针的指向
    queue->pTail->next = newNode;
    newNode->next = NULL;
    queue->pTail = newNode;

    //更新队列大小
    queue->size++;
}

//出队
void pop_LinkQueue(LinkQueue queue)
{
    //本质  头删
    if (queue == NULL)
    {
        return;
    }

    if (queue->size == 0)
    {
        printf("空队,无法出队\n");
        return;
    }

    //记录第一个结点
    struct Node* pFirst = queue->header.next;

    //更新指针的指向
    queue->header.next = pFirst->next;

    //释放结点
    if (pFirst != NULL)
    {
        free(pFirst);
    }

    //队列中只有一个结点的时候,再出队会影响尾指针,需要特判
    if (queue->size == 1)
    {
        queue->pTail = &queue->header;
    }

    //队列大小更新
    queue->size--;

}
//返回队头
int front_LinkQueue(LinkQueue queue)
{
    if (queue == NULL)
    {
        return -1;
    }

    return queue->header.next->data;
}

//返回队尾
int back_LinkQueue(LinkQueue queue)
{
    if (queue == NULL)
    {
        return -1;
    }

    return queue->pTail->data;
}

//返回队列大小
int size_LinkQueue(LinkQueue queue)
{
    if (queue == NULL)
    {
        return -1;
    }
    return queue->size;
}

//判断是否为空
int isEmpty_LinkQueue(LinkQueue queue)
{
    if (queue == NULL)
    {
        return -1;
    }
    if (queue->size == 0)
    {
        return 1;
    }

    return 0;
}
//销毁队列
void destroy_LinkQueue(LinkQueue queue)
{
    if (queue != NULL)
    {
        free(queue);
        queue = NULL;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机C语言消息队列是一种用于实现多任务处理的技术。它通过消息的传递来协调和同步不同的任务。在单片机中,可以使用C语言来实现消息队列的功能。 消息队列可以用于不同任务之间的通信和协作。发送任务可以将消息发送到消息队列中,而接收任务可以从消息队列中读取消息。这样,各个任务就可以通过消息队列来传递数据和指令。 消息队列可以用于实现多任务之间的同步。发送任务可以将消息发送到消息队列中,并等待接收任务来读取该消息。接收任务可以从消息队列中读取消息,并在完成任务后向发送任务发送确认消息。这样,发送任务可以等待确认消息,从而进行同步。 消息队列可以用于实现优先级调度。可以为每个消息指定一个优先级,具有较高优先级的消息将首先被处理。这样可以有效地处理具有不同优先级的任务。 C语言可以通过定义消息结构体、创建消息队列、发送消息和接收消息等操作来实现消息队列。在C语言中,可以通过结构体来定义消息的内容和格式,并通过指针来访问消息的各个字段。可以使用数组或链表等数据结构来实现消息队列,可以通过指针来实现消息的发送和接收操作。 在单片机中,可以使用C语言的位操作来实现消息队列的底层操作,例如读写消息队列的指针、判断消息队列是否为空等。此外,还可以使用中断机制来实现消息的异步传递和处理。 总之,单片机C语言消息队列是一种用于实现多任务处理的技术,可以通过消息的传递来实现任务间的通信、同步和调度。通过使用C语言的结构体、指针和位操作等特性,可以方便地实现消息队列的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值