객체 + 큐

4466 단어
// Queue .cpp :  。
//

#include "stdafx.h"
#include 
#include 
#include 
#include 
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 QueForObj;
}QueAtribute;

vector QueTotal;

map 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:: 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::iterator Index;
		for(unsigned int i = 0; i < QueTotal.size(); i++)
		{
			if (QueTotal[i].QueId == QueID)
			{     
				    map :: iterator Index;
					Index = ObjTypeQueID.find(ObjType);
					RETURN_IF(Index != ObjTypeQueID.end(), -1);
					ObjTypeQueID.insert(pair(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::iterator Position;
		map:: 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::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 &Vec)
{
	return 0;
}

int PopObj(unsigned int *ObjId)
{
	RETURN_IF(0 == ObjId, -1);
	int MaxPri = 0;
	uint Position = 0;
	vector::iterator MaxPriIndx;
	vector::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
",ObjID); } return 0; }

좋은 웹페이지 즐겨찾기