考试时拿了90分,运行出错,这次再看发现原因是有个数组开小了
当时的思路大体是保存每种值的字符串,如果它有上层,也直接把上层保存到字符串里
要记录每个的类型,以及一个数字指针指向key对应的值
查询时就只需要暴力搜一遍有没有符合的字符串,再看它是什么类型,对应输出
然后就是处理输入文本,我这里写的挺乱,先保存下来吧,有机会再整理下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
const int N=1000;
struct node
{
string k;
int sta;
int next;
}s[N]; //保存每个值的类型,还有内容,包括它的上层
int main()
{
int n,m;
string a;
node ne;
scanf("%d%d",&n,&m);
getchar();
int cnt=0,d=0;;
string b[100]; //这里开多大代表最深有几层,原来开了10,运行出错90分
string c="";
bool flag=0,flag0=0;
for(int i=0;i<n;i++)
{
getline(cin,a);
int l=a.length();
for(int j=0;j<l;j++)
{
if(a[j]=='{')
{
b[d++]=c;
flag0=0;
}
else if(a[j]=='}')
{
d--;
}
else if(a[j]==',')
{
flag0=0;
}
else if(a[j]==':')
{
flag0=1;
}
else if(a[j]=='"')
{
if(flag)
{
string p="";
if(!flag0)
for(int k=0;k<d;k++)
{
p+=b[k];
if(b[k].length())
p+='.';
}
p+=c;
ne.k=p;
if(flag0)
{
s[cnt-1].next=cnt;
ne.sta=1;
}
else ne.sta=0;
ne.next=-1;
s[cnt++]=ne;
}
if(!flag) c="";
flag=flag?0:1;
}
else if(a[j]=='\\')
{
if(flag)
{
j++;
c+=a[j];
}
}
else if(a[j]==' '||a[j]=='\n')
{
}
else
{
if(flag) c+=a[j];
}
}
}
for(int i=0;i<m;i++)
{
cin>>a;
bool find=0;
for(int j=0;j<cnt;j++)
{
if(s[j].k==a&&s[j].sta==0)
{
if(s[j].next==-1) cout<<"OBJECT"<<endl;
else
cout<<"STRING "<<s[s[j].next].k<<endl;
find=1;
break;
}
}
if(!find) cout<<"NOTEXIST"<<endl;
}
return 0;
}