用C++编写一个程序模拟患者在医院等待就诊的情况

【实验题目内容】

队列的实现与应用。编写一个程序模拟患者在医院等待就诊的情况,主要模拟下面两种场景:患者到达诊室,将病历交给护士,排到等待队列中候诊;护士从等待队列中取出下一位患者的病历,该患者进入诊室就诊。程序的功能说明如下:
1)排队:输入排队患者的病历号,加入到就诊患者排队队列中;
2)就诊:患者队列中最前面的病人就诊,并将其从队列中删除;
3)查看:从队首到队尾列出所有排队患者的病历号;
4)编写main()函数对上述功能进行测试。

【实验环境】(使用的软件):VS - 2010

【项目设计源代码】

// stdafx.h头文件即所需的头文件
#include<iostream>

using namespace std;
//Patient.h
#pragma once
class Patient
{
public:
	Patient(void);
	~Patient(void);
protected:
	//患者病历号
	long ID;
	// 从输入流类对象in中提取患者patient的信息
 	friend istream& operator >> (istream& in, Patient& patient);
	// 在输出流类对象out中插入患者patient的信息
	friend ostream& operator << (ostream& out, Patient& patient);

};

//Patient.cpp
#include "StdAfx.h"
#include "Patient.h"

Patient::Patient(void)
{
	ID = 0;
}

Patient::~Patient(void)
{
}

//从输入流类对象in中提取患者patient的信息
istream& operator >> (istream& in, Patient& patient)
{
	cout << "输入患者病历号?";
	// 从输入流类对象in中提取患者patient的病历号
	in >> patient.ID;
	return in;
}

//在输出流类对象out中插入患者patient的信息
ostream& operator << (ostream& out, Patient& patient)
{
	out << "患者病历号:";
  //在输出流类对象out中插入患者patient的病历号
	out << patient.ID;
	return out;
}

// linkNode.h单链表的结点类模板头文件
#pragma once
// 单链表的结点
// T为单链表中元素的模板类型
template <class T>
class linkNode
{
public:
	linkNode(void);
	~linkNode(void);
	T data;
	linkNode<T>* next;
};

template <class T>
linkNode<T>::linkNode(void)
{
}

template <class T>
linkNode<T>::~linkNode(void)
{
}

// LinkQueue.h链队列的类模板头文件
#pragma once
#include "linkNode.h"
// 链队列的类模板
// T为链队列中元素的模板类型
template <class T>
class LinkQueue
{
public:
	// 构造函数
	LinkQueue(void);
	// 析构函数
	~LinkQueue(void);
protected:
	// 队头指针
	linkNode<T>* front;
	// 队尾指针
	linkNode<T>* rear;
public:
	// 遍历输出链队列
	void Print(void);
	// 判断队列是否空
	bool IsEmpty(void) const;
	// 判断队列是否满
	bool IsFull(void) const;
	// 新元素newData进链队尾,进队成功,
	// 则返回true,否则,返回false
	bool EnQueue(T newData);
	// 取队头元素frontData,取队头元素成功,
	// 则返回true,否则,返回false
	bool GetFront(T& frontData);
	// 队头元素frontData出队,出队成功,
	// 则返回true,否则,返回false
	bool DeQueue(T& frontData);
	// 清空队列
	void makeEmpty(void);
};

// 构造函数
template <class T>
LinkQueue<T>::LinkQueue(void)
{
	front=rear=NULL;
}

// 析构函数
template <class T>
LinkQueue<T>::~LinkQueue(void)
{
	makeEmpty();
}

// 遍历输出链队列
template <class T>
void LinkQueue<T>::Print(void)
{
	cout<<"front→";
	linkNode<T>* current=front;
	while(current!=NULL)
	{
		cout<<"["<<current->data<<"]";
		current=current->next;
		if(current!=NULL)
		{
			cout<<"[-]→";
		}
	}
	cout<<"[^]"<<endl;
}

// 判断队列是否空
template<typename T>
bool LinkQueue<T>::IsEmpty(void) const
{
	return front == NULL;
}

// 判断队列是否满
template<typename T>
bool LinkQueue<T>::IsFull(void) const
{
	return false;
}

// 新元素newData进链队尾,进队成功,
// 则返回true,否则,返回false
template <class T>
bool LinkQueue<T>::EnQueue(T newData)
{
	if (IsEmpty())
	{
		//队列空,创建第一个结点
		front = rear = new linkNode<T>;
       if (front == NULL)
	   {
		   return false;//进队失败
	   }
	   else
	   {
		   front->data=newData;
		   front->next=NULL;
	   }
	} 
	else
	{ 
		//队列不空,新结点作为原队尾的后继
		rear->next = new linkNode<T>;
		if (rear->next == NULL)
		{
			return false; //进队失败
		}
		else
		{
			rear = rear->next;
			rear->data=newData;
			rear->next=NULL;
		}
    }
    return true; //进队成功 
}

// 取队头元素frontData,取队头元素成功,
// 则返回true,否则,返回false
template <class T>
bool LinkQueue<T>::GetFront(T& frontData)
{
	if (IsEmpty())
	{
		// 队空,无任何元素
		return false;
	}
	else
	{
		// 队头元素通过引用形参frontData返回
		frontData=front->data;
		// 取队头元素成功,返回true
		return true;
	}
}

// 队头元素frontData出队,出队成功,
// 则返回true,否则,返回false
template <class T>
bool LinkQueue<T>::DeQueue(T& frontData)
{
	if (IsEmpty())
	{
		// 队空,无任何元素
		return false;
	}
	else
	{
		// 队头元素通过引用形参frontData返回
		frontData=front->data;
		// 保存原队头元素的地址
		linkNode<T>* oldFront=front;
		// 保存原队头元素的后继成为新的队头
		front=front->next;
		// 释放原队头元素的空间
		delete oldFront;
		// 队头元素出队成功,返回true
		return true;
	}
}

// 清空队列
template <class T>
void LinkQueue<T>::makeEmpty(void)
{
	linkNode<T>* deleteNode,*current=front;
	while(current)
	{
		deleteNode=current;
		current=current->next;
		delete deleteNode;
	}
	front=rear=NULL;
}

//主函数
#include "stdafx.h"
#include "LinkQueue.h"
#include "Patient.h"

int _tmain(int argc, _TCHAR* argv[])
{
	system("color F0");

	// 患者
    Patient firstPatientBeenEntered, secondPatientBeenEntered, frontPatientBeenGeted, firstPatientBeenDeleted, secondPatientBeenDeleted;
    cout << "测试初始化患者队列:" << endl;
    // 创建患者排队队列patientQueue,元素为患者
    LinkQueue<Patient> patientQueue;
	cout << "查看:从队首到队尾列出所有排队患者:";
    patientQueue.Print();
	cout << endl;

    cout << "排队:患者加入到患者队列中。输入排队的患者:";
    cin >> firstPatientBeenEntered;

	// 第1个患者firstCustomerBeenEntered进患者队列队尾
    if(patientQueue.EnQueue(firstPatientBeenEntered))
    {
        cout << "第1个患者的" << firstPatientBeenEntered << "进患者队列的队尾。";
    }
    else
    {
        cout << "患者" << firstPatientBeenEntered << "无法进患者队列。";
    }
	cout << endl;
	cout << "查看:从队首到队尾列出所有排队患者:";
    patientQueue.Print();
	cout << endl;
    cout<<"排队:患者加入到患者队列中。输入排队的患者:";
    cin >> secondPatientBeenEntered;

	//第2个客户secondPatientBeenEntered进患者队列队尾
    if(patientQueue.EnQueue(secondPatientBeenEntered))
    {
        cout << "第2个患者的" << secondPatientBeenEntered << "进患者队列。";
    }
    else
    {
        cout<< "患者" << secondPatientBeenEntered << "无法进患者队列。";
    }
	cout << endl;
	cout<<"查看:从队首到队尾列出所有排队患者:";
    patientQueue.Print();
	cout << endl;
	cout<<"就诊:患者队列中最前面的患者出队列。";
    // 第1个患者firstPatientBeenEntered出队列
    if(patientQueue.DeQueue(firstPatientBeenDeleted))
    {
        cout << "第1个患者的" << firstPatientBeenDeleted << "出患者队列。";
    }
    else
    {
        cout << "患者队列为空,无任何患者。";
    }
	cout << endl;
	cout<<"就诊:患者队列中最前面的患者出队列。";
    // 第2个患者secondPatientBeenDeleted出队列
    if(patientQueue.DeQueue(secondPatientBeenDeleted))
    {
        cout<<"第2个患者的"<<secondPatientBeenDeleted<<"出患者队列。";
    }
    else
    {
        cout<<"患者队列为空,无任何患者。";
    }
	cout << endl;
	cout<<"查看:从队首到队尾列出所有排队患者:";
    patientQueue.Print();

	system("PAUSE");
	return 0;
}

【项目测试运行结果截图】

运行结果

备注:各位小可爱们如果有任何的疑问可以在评论区留下你的思考,大家一起进步 yo~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值