排号机
描述:
实现一个简易的银行排号叫号系统
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");
}
转载于:https://blog.51cto.com/mrcage/1564362