首先,將全部的輸入連接起來,存儲到字元串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; }