题目来源:- 计算机软件能力认证考试系统
思路:采用regex类处理,首先把输入的字符串合并到一起,再按照自己的需求通过regex类拆分,进行递归处理。
#include<bits/stdc++.h>
using namespace std;
stringstream ss;
unordered_map<string,string> ans;
bool handle(string key) {
string value;
ss>>value;
if(value == "}")
return false;
if(value == "{") {
if(key != "")
ans[key]="{}"; //该键对应的值是一个object
while(handle(key)); //递归处理直到当前{}里的字符串处理完
} else {
string v=value.substr(1, value.rfind('"')-1);
if(value.back() == ':') //back()返回末尾字符:,表示该字符串是键
handle((key == "") ? v : (key+"."+v)); //如果key存在,就继承key原来的值
else
ans[key]=v;
}
return true;
}
int main() {
int a,b;
cin>>a>>b;
getchar();
string s="";
while(a--) {
string line;
getline(cin,line);
s+=line;
}
s=regex_replace(s, regex(" "), "");
s=regex_replace(s, regex("\\\\\""), "\""); //将\"转换为"(\\"代表")
s=regex_replace(s, regex("\\\\\\\\"),"\\"); //将\\转换为\(\\\代表\)
s=regex_replace(s, regex(","), ", "); //在每个,字符后添加一个空格字符
s=regex_replace(s, regex(":"), ": "); //在每个:字符后添加一个空格字符
s=regex_replace(s, regex("\\{"), " { "); //在每个{字符左右均添加空格字符('{'要转义)
s=regex_replace(s, regex("},?"), " } "); //将},转换为}('?'要求','出现0次或1次)
ss<<s;
handle("");//递归处理
while(b--) {
cin>>s;
if(ans.find(s) == ans.end()) //fina()查询不到会返回end()值
cout<<"NOTEXIST"<<endl;
else if(ans[s] == "{}")
cout<<"OBJECT"<<endl;
else
cout<<"STRING "<<ans[s]<<endl;
}
return 0;
}
C++正则表达式知识可参考以下内容:
C++正则表达式_HesseSummer的博客-CSDN博客_c++正则表达式
C++正则表达式_monk1992的博客-CSDN博客
|