对象+队列

// Queue对象.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
typedef  unsigned int  uint;
#define RETURN_IF(a,b)  if(a){return b;}
uint g_RecordInQueTime = 0;

typedef struct tag_ObjAtribute
{
	uint ObjId;
	int  ObjType;
	uint ObjWeight;
	uint ObjInTime;
}ObjAtribute;

typedef struct tag_QueAtribute
{
	uint QueId;
	int  QuePri;
	uint QueLen;
	vector<ObjAtribute> QueForObj;
}QueAtribute;

vector<QueAtribute> QueTotal;

map<unsigned int,unsigned int> ObjTypeQueID;

int CreateQue(unsigned int QueID, unsigned int QuePri, unsigned int QueLen)
{
		RETURN_IF(QueID < 1 || QueID >5 || QuePri <1 || QuePri >5 || QueLen <1 || QueLen > 0xFFFFFFFF,-1);
		vector<QueAtribute>:: iterator Index;
		for (Index = QueTotal.begin(); Index != QueTotal.end();Index++)
		{
			if (Index->QueId == QueID)
			{
				return -1;
			}
		}
		QueAtribute InitQue;
		InitQue.QueId   = QueID;
		InitQue.QuePri  = QuePri;
		InitQue.QueLen = QueLen; 
		QueTotal.push_back(InitQue);
		return 0;
}

int SetObjTypeToQue(unsigned int ObjType, unsigned int QueID)
{
		RETURN_IF(QueID < 1 || QueID >5 || ObjType <1 || ObjType >5 ,-1);
		vector<QueAtribute>::iterator Index;
		for(unsigned int i = 0; i < QueTotal.size(); i++)
		{
			if (QueTotal[i].QueId == QueID)
			{     
				    map<unsigned int,unsigned int> :: iterator Index;
					Index = ObjTypeQueID.find(ObjType);
					RETURN_IF(Index != ObjTypeQueID.end(), -1);
					ObjTypeQueID.insert(pair<unsigned int,unsigned int>(ObjType,QueID));
					return 0;
			}
		}
		return -1;
}

int PushObj(unsigned int ObjId, unsigned int ObjType, unsigned int ObjWeight)
{
		//RETURN_IF(ObjId < 1 || ObjId >5 || ObjType <1 || ObjType >5 || ObjWeight <1 || ObjWeight > 0xFFFFFFFF,-1);
		uint MinWeight = ObjWeight;
		vector<ObjAtribute>::iterator Position;
		map<uint,uint>:: iterator Index;
		Index = ObjTypeQueID.find(ObjType);
		RETURN_IF(Index == ObjTypeQueID.end(), -1);
		int QueID = Index->second;
		for (uint i = 0; i < QueTotal.size(); i ++)
		{
			if (QueTotal[i].QueId == QueID)
			{
				for (vector<ObjAtribute>::iterator Index = QueTotal[i].QueForObj.begin(); Index != QueTotal[i].QueForObj.end(); Index++)
				{
						RETURN_IF(Index->ObjId == ObjId, -1);
						if (Index->ObjWeight < MinWeight)
						{
							MinWeight = Index->ObjWeight;
							Position = Index;
						}
				}
				if (QueTotal[i].QueLen == QueTotal[i].QueForObj.size() )
				{	
						if (ObjWeight > MinWeight)
						{
							QueTotal[i].QueForObj.erase(Position);
						}
						else{return -1;}
				}	
				g_RecordInQueTime ++;
				ObjAtribute InitObj;
				InitObj.ObjId        = ObjId;
				InitObj.ObjType    = ObjType;
				InitObj.ObjWeight = ObjWeight;
				InitObj.ObjInTime = g_RecordInQueTime;
				QueTotal[i].QueForObj.push_back(InitObj);
				return 0;
			}
		}
		return -1;
}

int printVector(vector<ObjAtribute> &Vec)
{
	return 0;
}

int PopObj(unsigned int *ObjId)
{
	RETURN_IF(0 == ObjId, -1);
	int MaxPri = 0;
	uint Position = 0;
	vector<ObjAtribute>::iterator MaxPriIndx;
	vector<ObjAtribute>::iterator Index;
	for (uint i = 0; i < QueTotal.size(); i ++)
	{	
		if (QueTotal[i].QuePri > MaxPri &&QueTotal[i].QueForObj.size() != 0)
		{
			MaxPri = QueTotal[i].QuePri;
			Position = i;
		}
	}
	printVector(QueTotal[Position].QueForObj);
	for (Index = QueTotal[Position].QueForObj.begin(); Index != QueTotal[Position].QueForObj.end(); Index ++)
	{
		if (Index->ObjWeight > MaxPri)
		{
			MaxPri = Index->ObjWeight;
			MaxPriIndx = Index;
		}
		else if (Index->ObjWeight = MaxPri)
		{
			if (Index->ObjInTime < MaxPriIndx ->ObjInTime)
			{
				MaxPriIndx = Index;
			}
		}
	}
	*ObjId = 0;
	if (MaxPri != 0)
	{
		*ObjId = MaxPriIndx->ObjId;
		 QueTotal[Position].QueForObj.erase(MaxPriIndx);		
	}
	return 0;
}



int main()
{
	CreateQue(1,1,20)	;
	CreateQue(2,2,10);
	SetObjTypeToQue(1,1);
	SetObjTypeToQue(2,1);
	SetObjTypeToQue(3,2);
	PushObj(111,1,222);
	PushObj(112,2,223);
	PushObj(113,1,223);
	PushObj(114,2,225);
	PushObj(115,3,300);
	unsigned int ObjID = 0;
	for (int i = 0; i < 5; i ++)
	{
		PopObj(&ObjID);
		printf("%d\n",ObjID);
	}

	return 0;
}


以下是使用C++队列实现的医院挂号系统的代码: ``` #include <iostream> #include <string> #include <queue> using namespace std; class Patient { private: string name; int age; string gender; string disease; public: Patient(string n, int a, string g, string d) { name = n; age = a; gender = g; disease = d; } void display() { cout << "Name: " << name << endl; cout << "Age: " << age << endl; cout << "Gender: " << gender << endl; cout << "Disease: " << disease << endl; } }; class Hospital { private: queue<Patient> patients; public: void addPatient(Patient p) { patients.push(p); cout << "Patient added successfully!" << endl; } void displayPatients() { if (patients.empty()) { cout << "No patients in queue." << endl; return; } queue<Patient> temp(patients); while (!temp.empty()) { temp.front().display(); cout << endl; temp.pop(); } } void servePatient() { if (patients.empty()) { cout << "No patients in queue." << endl; return; } patients.front().display(); cout << " has been served." << endl; patients.pop(); } }; int main() { Hospital hospital; string name, gender, disease; int age; int choice; do { cout << "1. Add Patient" << endl; cout << "2. Display Patients" << endl; cout << "3. Serve Patient" << endl; cout << "4. Exit" << endl; cout << "Enter your choice: "; cin >> choice; switch (choice) { case 1: cout << "Enter patient name: "; cin >> name; cout << "Enter patient age: "; cin >> age; cout << "Enter patient gender: "; cin >> gender; cout << "Enter patient disease: "; cin >> disease; Patient p(name, age, gender, disease); hospital.addPatient(p); break; case 2: hospital.displayPatients(); break; case 3: hospital.servePatient(); break; case 4: cout << "Exiting program..." << endl; break; default: cout << "Invalid choice! Try again." << endl; break; } } while (choice != 4); return 0; } ``` 这个程序使用了STL库中的queue来实现医院挂号系统。Patient类表示患者,包含姓名、年龄、性别和疾病等信息,并有一个display方法用于显示患者信息。Hospital类表示医院,包含一个患者队列,有三个方法:addPatient用于添加患者到队列中,displayPatients用于显示所有患者的信息,servePatient用于表示医院已经为队列中的第一个患者提供了服务。 在主函数中,我们首先创建了一个Hospital对象,并通过一个do-while循环来提供用户菜单选择。用户可以选择添加患者、显示所有患者信息、为队列中的第一个患者提供服务或退出程序。当用户选择添加患者时,程序会提示用户输入患者姓名、年龄、性别和疾病等信息,并创建一个Patient对象,然后将该对象添加到Hospital对象的患者队列中。当用户选择显示所有患者信息时,程序会遍历Hospital对象的患者队列,并调用每个患者对象的display方法来显示其信息。当用户选择为队列中的第一个患者提供服务时,程序会显示第一个患者的信息,并将其从患者队列中移除。 这个程序可以作为医院挂号系统的一个简单实现,使用队列来存储患者信息,保证了按照先来后到的顺序进行服务。同时,队列的FIFO(先进先出)特性也符合了医院挂号系统的实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值