CCF-20170903--JSON查询
首先,将全部的输入连接起来,存储到字符串str中,再将\\全部替换为\空格。
再依次遍历str。
对于:“A”:“B”这种情况,我们以:为分界点来分别存储key和value来进行存储
对于:“A”:{
“B”:“C”
}的这种情况,我们如果在:号后面遇到的不是引号,那就将value设置为OBJECT,进行存储,这里主要要注意前缀问题,我们使用一个vector来模拟栈
来处理前缀,每次遇到{,就将key添加到vector中,每次约到},就将vector最后面的元素删除。
最后,这里有几个坑:
1.考虑\\\*,\*\\的情况
2.三层甚至多层的情况
3.“A”:{},这种value是空的键值对的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | #include<bits/stdc++.h> using namespace std; void trim(string &s) { int index = 0; if ( !s.empty()) { while ( (index = s.find( ' ' ,index)) != string::npos) { s.erase(index,1); } } } void operator_find(string & s,string findStr,string replaceStr){ //将字符串s中的findStr替换为replaceStr。 int size=0; while (s.find(findStr)!=string::npos){ size=s.find(findStr)+findStr.length(); s.replace(s.find(findStr),replaceStr.length(),replaceStr); } } int main(){ int m,n; cin>>m>>n; cin.ignore(); string str= "" ; map<string,string> mmps; vector<string> stks; for ( int i=0;i<m;i++){ string tempStr; getline(cin,tempStr); str+=tempStr; } operator_find(str, "\\\\" , "\\ " ); trim(str); //cout<<str<<endl; int i=0; string ObjStr= "" ; //用来存放Obj的前缀 int flag=0; //用来区别key与value; string key= "" ,value= "" ; while (str[i]!= '\0' ){ key= "" ,value= "" ; //cout<<"Str[i]:"<<str[i]<<endl; while (str[i]!= '}' &&str[i++]!= '\"' ); while (str[i]!= ':' &&str[i]!= '}' ){ //提取key值 key+=str[i]; i++; } if (str[i]!= '}' ) //用于处理出现}}}}类似的情况 i=i+1; //跳过冒号 if (str[i]== '\"' ){ //提取value值 i++; while (str[i]!= ',' &&str[i]!= '}' ){ value+=str[i]; i++; } } else { //value不是字符串,而是对象的情况 if (key!= "" ||value!= "" ){ string Qianzui= "" ; if (stks.size()!=0){ for ( int ii=0;ii<stks.size();ii++){ if (ii==0) Qianzui+=stks[ii]; else Qianzui=Qianzui+ "." +stks[ii]; } } key=key.substr(0,key.length()-1); operator_find(key, "\\\"" , " " ); trim(key); stks.push_back(key); if (Qianzui!= "" ) key=Qianzui+ "." +key; mmps[key]= "OBJECT" ; } } if (str[i]== ',' ){ //存储键值对 if (stks.size()!=0){ string Qianzui= "" ; for ( int ii=0;ii<stks.size();ii++){ if (ii==0) Qianzui+=stks[ii]; else Qianzui=Qianzui+ "." +stks[ii]; } key=Qianzui+ "." +key; } key=key.substr(0,key.length()-1); value=value.substr(0,value.length()-1); operator_find(key, "\\\"" , " " ); operator_find(value, "\\\"" , " " ); trim(key); trim(value); mmps[key]= "STRING " +value; key= "" ,value= "" ; } if (str[i]== '}' ){ //vector退栈的情况 if (key!= "" ||value!= "" ){ if (stks.size()!=0){ string Qianzui= "" ; for ( int ii=0;ii<stks.size();ii++){ if (ii==0) Qianzui+=stks[ii]; else Qianzui=Qianzui+ "." +stks[ii]; } key=Qianzui+ "." +key; } key=key.substr(0,key.length()-1); value=value.substr(0,value.length()-1); operator_find(key, "\\\"" , " " ); operator_find(value, "\\\"" , " " ); trim(key); trim(value); mmps[key]= "STRING " +value; key= "" ,value= "" ; if (stks.size()!=0){ stks.erase(stks.end()-1); } } else { if (stks.size()!=0){ stks.erase(stks.end()-1); } } } i++; } for ( int i=0;i<n;i++){ string temps; cin>>temps; map<string,string>::iterator it; it=mmps.find(temps); if (it==mmps.end()){ cout<< "NOTEXIST" <<endl; } else { cout<<mmps[temps]<<endl; } } return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2016-03-06 VS如何显示行号