欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

CCF-20170903--JSON查询

程序员文章站 2022-04-19 13:39:41
首先,将全部的输入连接起来,存储到字符串str中,再将\\全部替换为\空格。再依次遍历str。对于:“A”:“B”这种情况,我们以:为分界点来分别存储key和value来进行存储对于:“A”:{ “B”:“C” }的这种情况,我们如果在:号后面遇到的不是引号,那就将value设置为OBJECT,进行 ......

首先,将全部的输入连接起来,存储到字符串str中,再将\\全部替换为\空格。
再依次遍历str。
对于:“A”:“B”这种情况,我们以:为分界点来分别存储key和value来进行存储
对于:“A”:{
“B”:“C”
}的这种情况,我们如果在:号后面遇到的不是引号,那就将value设置为OBJECT,进行存储,这里主要要注意前缀问题,我们使用一个vector来模拟栈
来处理前缀,每次遇到{,就将key添加到vector中,每次约到},就将vector最后面的元素删除。
最后,这里有几个坑:
1.考虑\\\*,\*\\的情况
2.三层甚至多层的情况
3.“A”:{},这种value是空的键值对的情况。

 

#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;
}