天天看点

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

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

get    取号  示例:"get"或"get vip"

call  叫号 示例:"call"

delete 删除号码 示例:"delete5"

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)叫号。获取当前应该处理用户的号码。例如当前排队号码为123457,当输入"call",执行结果为"1",如1为vip号码,则为"vip 1".如果再连续调用6次,第六次执行结果应为"error"

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

再次输出"delete 5",执行结果为"error"

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

5)获取在某个号码之前排队的总人数。例如当前排队号码为123457,输入"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

//设置2个容器,一个放普通,一个放置vip
//删除,string取出,删除“vip ”比较数字;call的VIP优先级;delete的最大值删除之后取号还为最大值;
//delete 23a是错误的输入。(没有判断)删掉“delete ”,判断后面的是不是重数字12a;
///
//
#include<iostream>
#include<string>
#include<vector>
using namespace std;
static int n=0;
static vector<int> v1;
static vector<string> v2;
//删除"delete "和"countN ",取出后面数字
int shuzi(string s,int sn)
{
	int xn=0;
	int i;
	for(i=sn;i<s.size();i++)
		if(s[i]>='0'&&s[i]<='9')
			xn=10*xn+(s[i]-'0');
		else
		{
			xn=0;
			break;
		}
		return xn;
}
//取号;
void get(string s)
{
	n++;
	string s0;
	if(s=="get")
	{
		cout<<n<<endl;
		v1.push_back(n);
	}
	else
		{
			cout<<"vip "<<n<<endl;
			s0=s0+"vip "+char(n+'0');
			//cout<<s0<<endl;
			v2.push_back(s0);
		}
}
//叫号;
void call(string s)
{
	vector<int>::iterator iter1=v1.begin();
	vector<string>::iterator iter2=v2.begin();
	if(n==0)
		cout<<"error"<<endl;
	else
		if(!v2.empty())
		{
			cout<<*iter2<<endl;
			v2.erase(iter2);
		}
		else
			if(!v1.empty())
			{
				cout<<*iter1<<endl;
				v1.erase(iter1);
			}
			else
				cout<<"error"<<endl;
}
//删除号码;
void delet(string s)
{
	int deln=shuzi(s,7);
	//cout<<deln<<endl;
	vector<int>::iterator iter1=v1.begin();
	vector<string>::iterator iter2=v2.begin();
	vector<int>::iterator iter3=v1.end();
	vector<string>::iterator iter4=v2.end();
	//注意把for循环提前,这样就不会出错;
	for(vector<int>::iterator iter1=v1.begin();iter1!=v1.end();iter1++)
		if(*iter1==deln)
			iter3=iter1;
	for(vector<string>::iterator iter2=v2.begin();iter2!=v2.end();iter2++)
		if(shuzi(*iter2,4)==deln)
			iter4=iter2;
	if(deln>n)
		cout<<"error"<<endl;
	else
		if(deln==n)
		{
			iter1=v1.end()-1;
			iter2=v2.end()-1;
			if(*iter1==n)
			{
				cout<<*iter1<<endl;
				v1.erase(iter1);
			}
			else
			{
				cout<<*iter2<<endl;
				v2.erase(iter2);
			}
			n--;
		}
		else
			if(iter3!=v1.end())
			{
				cout<<*iter3<<endl;
				v1.erase(iter3);
			}
			else
				if(iter4!=v2.end())
				{
					cout<<*iter4<<endl;
					v2.erase(iter4);
				}
				else
					cout<<"111111111error"<<endl;
}
//获取当前排队总人数
void count(string s)
{
	int count=v1.size()+v2.size();
	cout<<count<<endl;
}
//获取在某个号码之前排队的总人数
void countN(string s)
{
	int coun=shuzi(s,7);
	//cout<<coun<<endl;
	int k=0;
	vector<int>::iterator iter1=v1.begin();
	vector<string>::iterator iter2=v2.begin();
	for(;iter1!=v1.end();iter1++)
		if(*iter1<coun)
			k++;
	for(;iter2!=v2.end();iter2++)
		if(shuzi(*iter2,4)<coun)
			k++;
	cout<<k<<endl;
}	
//重值排号机
void reset(string s)
{
	n=0;
}
//退出排号机void quit(string s)

int main()
{
	string s,s1;
	//int deln,coun;
	while(getline(cin,s))
	{
		if(s=="get"||s=="get vip")
			get(s);
		else
			if(s=="reset")
				reset(s);
			else
				if(s=="call")
					call(s);
				else
					if(s=="count")
						count(s);
					else
						if(s=="quit")
							break;
						else
						{
							s1=s.substr(0,7);
							//deln=shuzi(s,7);//不一定是一位数字,“delete ”,取后面
							if(shuzi(s,7)==0||shuzi(s,7)>100000)    //shuzi(s,7)这样调用时可以的
								cout<<"error"<<endl;
							else
								if(s1=="delete ")
									delet(s);
								else
									if(s1=="countN ")
										countN(s);
									else
										cout<<"error"<<endl;
						}
	}
	return 0;
}
           

继续阅读