【队列应用】模拟患者排队治疗

问题阐述:

患者医院看病过程:先排队等候,再看病治疗。在排队的过程中主要重复做两件事情,一是患者到达诊室时,将病历交给护士,排到等候队列中候诊;二是护士从等候队列中取出下一个患者的病历,该患者进入诊室看病。 按照“先到先服务”的原则,设计一个算法模拟病人等候就诊的过程。其中“病人到达”用命令a表示,“护士让下一位患者就诊”用命令n表示,“不再接受病人排队”用命令q表示。


算法思想:

在排队中按照“先到先服务”的原则,设计一个算法模拟病人等候就诊的过程。其中“病人到达”用a表示,“护士让下一位患者就诊”用命令n表示,“不在接受病人排队”用q表示。

本算法采用链队存放患者的病历号:

①当有“病人到达”命令时,则入队。

②当有“护士让下一位患者就诊”命令时,则出队。

③当有:“不在接受病人排队”命令时,则队列中的所有元素出队,程序终止。

 不多说,直接上代码!

#include <iostream.h>
#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);//初始化队列
bool IsEmpty(LinkQueue &Q);//判断是否为空
void EnQueue(LinkQueue &Q, QElemType &e);//入队 
void DeQueue(LinkQueue &Q, QElemType &e);//出队
void SeeDoctor();//模拟看病
 
int main()
{
	cout<<"欲模拟病人排队就诊过程!!!"<<endl;
	cout<<"其中病人到达用命令a表示,护士让下一位患者就诊用命令n表示,不再接受病人排队用命令q表示."<<endl;
	SeeDoctor();
	return 0;
} 


/*********************各个子函数功能的实现*********************/ 
//初始化队列 
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 EnQueue(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 DeQueue(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);//初始化队列Q 
	int flag=1;
	while(flag)
	{
		printf("\n请输入命令:");
		ch=getch();
		switch(ch){
			case 'a':printf("\n病历号:");
					 cin>>n;
					 EnQueue(Q,n);
					 break; 
			case 'n':if(!IsEmpty(Q))
					 {
					 	DeQueue(Q,n);
							printf("\n病历号为%d的病人就诊",n);
					 }
					 else	
					 	printf("\n无病人等候就诊"); 
					 break; 
			case 'q':cout<<"\n今天停止挂号,下列病人依次就诊:\n";
					 while(!IsEmpty(Q))
					 {
					 	DeQueue(Q,n);
					 	printf("%d\n",n);
					 }
					 flag=0;
					 break; 
			default:printf("\n非法命令!");
		}
	}
}

 

执行效果(模拟两种情况):

 

 分享完毕~


版权声明:本文为Jesonary原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。