队列应用-----模拟患者医院看病过程
患者医院看病过程是,先排队等候,再看病治疗。在排队的过程中主要重复做两件事情,一是患者到达诊室时,将病历交给护士,排到等候队列中就诊;二是护士从等候队列中取出下一个患者的病历,该患者进入诊室看病。
【算法思想】
在排队中按照“先到先服务”的原则,设计一个算法模拟病人等候就诊的过程。其中“病人到达”用a表示,“护士让下一位患者就诊”用命令n表示,“不在接受病人排队”用q表示。
本算法采用链队存放患者的病历号:
①当有“病人到达”命令时,则入队。
②当有“护士让下一位患者就诊”命令时,则出队。
③当有:“不在接受病人排队”命令时,则队列中的所有元素出队,程序终止。
【算法描述】
void SeeDoctor()
{
InitQueue(Q);
int flag=1;
while(flag)
{
printf("\n请输入命令:");
ch=getch();
switch(ch){
case 'a':printf("\n病历号:");
scanf("%d",&n);
EnterQueue(&Q,n);
break;
case 'n':if(!IsEmpty(Q))
{
DeleteQueue(&Q,&n);
printf("\n病历号为%d的病人就诊",n);
}
else
printf("\n无病人等候就诊");
break;
case 'q':printf("\n今天停止挂号,下列病人一次就诊:");
while(!IsEmpty(Q))
{
DeleteQueue(&Q,&n);
printf("%d",n);
}
flag=0;
break;
default:printf("\n非法命令!");
}
}
}
【完整算法代码】
#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#include<conio.h>
typedef int QElemType;
int ch,n;
//存储结构
typedef struct QNode
{
QElemType data;
struct QNode *next;
}Qnode, *QueuePtr;
//队头队尾指针
typedef struct
{
QueuePtr front;//对头指针
QueuePtr rear; //队尾指针
}LinkQueue;
LinkQueue Q;
//构造一个空队列
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
Q.front->next = NULL;
}
//判断是否为空
bool IsEmpty(LinkQueue &Q)
{
if (Q.front == Q.rear) return true;
return false;
}
//入队
void EnterQueue(LinkQueue &Q, QElemType &e)
{
Qnode *p;
p = (QueuePtr)malloc(sizeof(QNode));
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
//出队
void DeleteQueue(LinkQueue &Q, QElemType &e)
{
Qnode *p;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p)
Q.rear = Q.front;
free(p);
}
//看病
void SeeDoctor()
{
InitQueue(Q);
int flag=1;
while(flag)
{
printf("\n请输入命令:");
ch=getch();
switch(ch){
case 'a':printf("\n病历号:");
scanf("%d",&n);
EnterQueue(Q,n);
break;
case 'n':if(!IsEmpty(Q))
{
DeleteQueue(Q,n);
printf("\n病历号为%d的病人就诊",n);
}
else
printf("\n无病人等候就诊");
break;
case 'q':printf("\n今天停止挂号,下列病人依次就诊:\n");
while(!IsEmpty(Q))
{
DeleteQueue(Q,n);
printf("%d\n",n);
}
flag=0;
break;
default:printf("\n非法命令!");
}
}
}
int main()
{
SeeDoctor();
return 0;
}
【运行截图】