用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~