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

被折叠的 条评论
为什么被折叠?



