描述:
实现一个简易的银行排号叫号系统
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"。
6、重置排号机。例如输入"reset",则重置排号机,进入初始状态,无需输出。
7、退出排号机。例如输入"quit",则退出排号机,无需输出。
样例输入: get
get
get
get vip
count
countN 1
call
quit
样例输出: 1
2
3
vip 4
4
1
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;
}