排号机
描述:     

实现一个简易的银行排号叫号系统

 

get    取号                     示例:"get"或"get vip"
call   叫号                     示例:"call"
delete 删除号码                 示例:"delete 5"
count  获取当前排队总人数       示例:"count"
countN 获取号码N以前的排队人数  示例:"countN"
reset  重置排号机               示例:"reset"

quit   退出排号机               示例:"quit"
运行时间限制:     无限制
内存限制:     无限制
输入:     

每行只会有一条输入(比如:C语言可使用gets函数获取一行输入命令的字符串)。
1、若输入不符合要求(如:命令字非法,或其他认为输入的错误)均需输出"error"
2、每条输出后使用换行符隔开(如后面示例)
输出:     

1)取号。可获取普通号和vip号码。如初始状态,输入"get",则获取普通号码,执行结果为"1",

如再次输入"get vip",则获取VIP号码,执行结果为"vip 2"。如果末尾的2号被删除,则再次调用"get"时应输出"2"

         VIP号码有绝对的优先级。普通号和vip号码统一编号,取号均为连续号码。号码从1开始编号,最大为100000.


2)叫号。获取当前应该处理用户的号码。例如当前排队号码为1 2 3 4 5 7,当输入"call",执行结果为"1",如1为vip号码,

则为"vip 1".如果再连续调用6次,第六次执行结果应为"error"



3)删除号码。客户不想办理时可删除号码,叫号时则跳过此号码。例如当前排队号码为1 2 3 4 5,输入"delete 5",执行结果为"5",

如果5为vip则显示"vip 5"。再次输出"delete 5",执行结果为"error"



4)获取当前排队总人数。获取当前排队人数。例如当前排队号码为1 2 3 4 5 6,执行结果为"6"


5)获取在某个号码之前排队的总人数。例如当前排队号码为1 2 3 4 5 7,输入"countN 7",执行结果为"5"


6、重置排号机。例如输入"reset",则重置排号机,进入初始状态,无需输出。

7、退出排号机。例如输入"quit",则退出排号机,无需输出。
样例输入:     

get
get
get
get vip
count
countN 1
call
quit

样例输出:     

1
2
3
vip 4
4
1
vip 4

#include <iostream>  
#include<vector>  
#include <queue>  
#include <map>  
#include <string>  
#include <algorithm>  
using namespace std;
map<string, int> m;
int numAll = 1;

class haoma
{
public:
	haoma(int a, bool b, bool c)
	{
		num = a;
		isVip = b;
		isDelete = c;
	}
	int num;
	bool isVip;
	bool isDelete;
};
vector<haoma> v;
void queueSystem(string in)
{
	string intemp;
	int num = 0;
	int k = in.find(' ');
	if ((in.find(' ') != -1) && in != "get vip")
	{
		intemp = in.substr(0, in.find(" "));
		string numS = in.substr(in.find(" "), in.length() - in.find(" "));
		num = atoi(numS.c_str());
	}
	else
	{
		intemp = in;
	}
	/*m.insert(pair<string,int>("get",0));
	m.insert(pair<string,int>("get vip",1));
	m.insert(pair<string,int>("delete",2));
	m.insert(pair<string,int>("count",3));
	m.insert(pair<string,int>("countN",4));
	m.insert(pair<string,int>("reset",5));
	m.insert(pair<string,int>("quit",6));*/
	if (intemp == "get")
	{
		vector<haoma>::iterator p = v.end();
		if (v.size()!=0)
		{
			p--;
		}
		vector<haoma>::iterator p1 = v.begin();
		int max = -1;
		while (v.size() != 0)    //?????????delete???
		{
			if (p == v.begin())
			{
				if (p->isDelete == true)
				{
					p1 = p;
					max = p->num;
				}
				break;
			}
			if (p->isDelete==true)
			{
				p1 = p;
				max = p->num;
				p--;
			}
			else{ 
				break; }
		}
		if (v.size() != 0 && p != (v.end() - 1)&& p1->isDelete == true)
		{
			p1->isDelete = false;
			p1->isVip = false;
			cout << max << endl;
		}
		else{
			haoma tempHaoma(numAll, false, false);
			v.push_back(tempHaoma);
			cout << numAll << endl;
			numAll++;
		}
	}
	if (intemp == "get vip")
	{
		vector<haoma>::iterator p = v.end();
		if (v.size() != 0)
		{
			p--;
		}
		vector<haoma>::iterator p1 = v.begin();
		int max = -1;
		while (v.size() != 0)    //?????????delete???
		{
			if (p==v.begin())
			{
				if (p->isDelete == true)
				{
					p1 = p;
					max = p->num;
				}
				break;
			}
			if (p->isDelete == true)
			{
				p1 = p;
				max = p->num;
				p--;
			}
			else{
				break;
			}
		}
		if (v.size() != 0&&p!=(v.end()-1)&&p1->isDelete == true)
		{
			p1->isDelete = false;
			p1->isVip = true;
			cout << "vip " << max << endl;
		}
		else{
			haoma tempHaoma1(numAll, true, false);
			v.push_back(tempHaoma1);
			cout << "vip " << numAll << endl;
			numAll++;
		}
	}
	if (intemp == "delete")
	{
		vector<haoma>::iterator p = v.begin();
		while (p != v.end())
		{
			if (p->num == num&&p->isDelete == false)
			{
				p->isDelete = true;
				cout << num << endl;
				return;
			}
			else if (p->num == num&&p->isDelete == false)
			{
				cout << "error" << endl;
				return;
			}
			p++;
		}
	}
	if (intemp == "count")
	{
		vector<haoma>::iterator p = v.begin();
		int numtemp = 0;
		while (p != v.end())
		{
			if (p->isDelete == false)
			{
				numtemp++;
			}
			p++;
		}
		cout << numtemp << endl;
	}
	if (intemp == "countN")
	{
		vector<haoma>::iterator p = v.begin();
		int numtemp = 0;   //  
		while (p != v.end())
		{
			if (p->num<num&&p->isDelete == false)
			{
				numtemp++;
			}
			p++;
		}
		if (numtemp == 0)
		{
			cout << numtemp + 1 << endl;
			return;
		}
		cout << numtemp << endl;
	}

	if (intemp == "reset")
	{
		vector<haoma>::iterator p = v.begin();
		while (p != v.end())
		{
			p = v.erase(p);
		}
		numAll = 1;
	}
	if (intemp == "call")
	{
		vector<haoma>::iterator p = v.begin();
		vector<haoma>::iterator p1 = v.begin();
		int min = 100001;
		bool existV = false;
		if (v.empty())
		{
			cout << "error" << endl;
			return;
		}
		while (p != v.end())
		{
			if (!existV&&p->num<min&&p->isDelete == false)
			{
				min = p->num;
				p1 = p;
			}
			if (existV&&p->num<min&&p->isDelete == false && p->isVip)
			{
				min = p->num;
				p1 = p;
			}
			if (p->isVip&&!existV)
			{
				existV = true;
				min = p->num;
				p1 = p;
			}
			p++;
		}
		if (p1->isVip == true)
		{
			cout << "vip " << min << endl;
		}
		else{
			cout << min << endl;
		}
		v.erase(p1);
	}
}

int main()
{
	string in[10000];
	//int i = 0;
	//while (in[i++] != "quit")
	//{
	//	getline(cin, in[i]);
	//}
	//for (int j = 1; j<i; j++)
	//{
	//	queueSystem(in[j]);
	//}
	queueSystem("get");  
	queueSystem("get");  
	queueSystem("call");  
	queueSystem("get");  
	queueSystem("delete 2");  

	queueSystem("get vip"); 
	queueSystem("delete 4");
	queueSystem("get");
	queueSystem("count");  
	queueSystem("countN 1");  
	queueSystem("call");  
	queueSystem("call");  
	queueSystem("call");  
	queueSystem("call");  
	queueSystem("call");  

	queueSystem("reset");  
	queueSystem("get");  
	queueSystem("get");  
	queueSystem("call");  
	queueSystem("get");  
	queueSystem("delete 3");  

	queueSystem("get vip");  
	queueSystem("count");  
	queueSystem("countN 1");  
	queueSystem("call");  
	queueSystem("call");  
	queueSystem("call");  
	queueSystem("call");  
	queueSystem("call");  
	queueSystem("quit");  
}