嵌入式学习15(队列)

本文介绍了嵌入式系统中队列的工作原理,重点讲解了如何使用结构体定义数据模型,并实现包括初始化、进队、出队等在内的功能。还讨论了队列假满的问题及其解决方案——循环队列,详细阐述了循环队列的满、空判断条件以及队列长度的计算。最后给出了相关实现代码的头文件和源文件。

1、队列:先进先出FIFO
2、数据模型:
struct queue
{
数据容器[队列长度];
rear;//队尾
front;//队头
};
3、功能:
初始化initQueue()
进队 EnQueue()
出队 DeQueue()
判断队为空 isEmpty()
判断队为满 isFull()
判断队列长度 QueueLenth()
清空队列 ClearQueue()
4、假满:由于通过rear指向尾处来进行判断是否为满,一当有队头元素出队时,队列不再为满。
if(rear==MAXSIZE-1) 满
if(front==rear) 空
5、解决方法:循环队列
核心:
头指针:指向第一个非空
尾指针:指向第一个空
满:(rear+1)%MAXSIZE==front 浪费一个空间来获得判断队满条件
空:front==rear
队长:(rear-fornt+MAXSIZE)%MAXSIZE

实现代码
头文件

#ifndef _QUEUE_DEF_
#define _QUEUE_DEF_

#include<stdbool.h>
#define MAXSIZE 10
//前置声明
struct queue;
struct patient;

typedef struct patient  QueueType;
//重命名struct queue;
typedef struct queue Queue;

struct patient
{
    char name[10];//姓名
    short sex;  //姓别 0男  1女
    char dp[100];   //科室                    
};
//队列结构体
struct queue
{
    QueueType buf[MAXSIZE];//队列容器
    int rear;//队尾
    int front;//队头
};

extern void initQueue(Queue*);//初始化队列
extern bool EnQueue(Queue*,QueueType);//进队
extern bool DeQueue(Queue*,QueueType*);//出队
extern bool isFull(Queue*);//判断满
extern bool isEmpty(Queue*);//判断空
extern unsigned short QueueLength(Queue*);//队列长度
extern bool ClearQueue();//清空队列 

#endif

源文件

#include <stdio.h>
#include "queue.h"
//初始化
void initQueue(Queue* pq)
{
    if(NULL!=pq)
    {
        pq->front=0;
        pq->rear=0;
    }
}
//判断是否为满
bool isFull(Queue* pq)
{
    //队头指向0,队尾再指向下标6
    if((pq->rear+1)%MAXSIZE == pq->front)
        return true;    
    return false;
}   
//判断为空
bool isEmpty(Queue* pq)
{

    if(pq->rear==pq->front)
        return true;
    return false;
}
//进队:前提不能为满
bool EnQueue(Queue*pq,QueueType data)
{
    if(isFull(pq))
        return false;
    //队尾站队--rear指向
    pq->buf[ pq->rear ]=data; 
    pq->rear=(pq->rear+1)%MAXSIZE;
    return true;
}
//队列长度
unsigned short QueueLength(Queue* pq)
{
    return (pq->rear - pq->front+MAXSIZE)%MAXSIZE;
}
//出队:前提不为空
bool DeQueue(Queue* pq,QueueType* data)
{
//队列不存在:
    if(NULL==pq || isEmpty(pq))
        return false;
    *data=pq->buf[pq->front];
    pq->front=(pq->front+1)%MAXSIZE;
    return true;
}
void main()
{
//定义自定义类型变量
    struct queue list;
//初始化
    initQueue(&list);
//银行叫号系统
    int opt=0;
    QueueType data;
    int num=0;
    while(1)
    {
        printf("please choise:");
        scanf("%d",&opt);
        switch(opt)
        {
            case 1://叫号
            {
                //取出队头元素
                if(DeQueue(&list,&data))
                {
                    printf("请%s到%s科室就诊\n",data.name,data.dp);
                }
                else//队列为空
                    printf("当前没有排队人数\n");
            }
            break;
            case 2://取号
            {

                printf("请输入姓名,姓别,科室:");
                scanf("%s %d %s",data.name,&data.sex,data.dp);
                if(EnQueue(&list,data))
                {
                    printf("挂号成功\n");
                }
                else
                    printf("当天预约已满\n");
            }
            break;
            case 3://查看当前队列人数
            {
                printf("当前队列的人数为%d\n",QueueLength(&list));
            }
            break;
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值