CCF-20170903--JSON查询

2018-06-17 21:06:12来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

首先,将全部的输入连接起来,存储到字符串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;
}

 

  

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:BZOJ1101: [POI2007]Zap(莫比乌斯反演)

下一篇:ccf-20170303--Markdown