声明:这个代码几乎完全就是照抄hyh学长的!!!
有什么问题我会删掉这篇的emm
当初面试的时候我的方向就是编译原理…然后学长发了个1400+的代码实现一个简化的c编译器…没看懂qaq
感觉很多知识还是很缺失的emm(当初连高维数组是怎么存的都不知道啊!指针几乎完全不会用啊!更别说什么函数怎么层层递归 变量怎么层层声明的)现在总算是懂了JSON这个呀越发觉得这个代码写得很美妙啊hhh
题意:
一段JSON结构的代码
一种是 字符串 名称-键值 “ ” : “ ”
一种是 对象(有对象名){}
对象里面可以是多个字符串,或者是嵌套的对象。
题解:
应该算是很典型的编译原理类题目吧
这个层层嵌套的对象怎么实现呢?其实是定义一个object类型,然后用每个对象用指针指向,一层层嵌套。有这个大概的想法可能不难,难点应该是在于这个代码怎么实现。
这个也是提醒我打之前要想好每个函数的作用,要准确清晰,不然会越打越混乱,无限debug。
#include<bits/stdc++.h>
using namespace std; string json;
string::iterator ptr; struct obj
{
map<string, obj *> child; string value; bool is_obj; obj() : is_obj(true) {}
obj(const string &value) : value(value),is_obj(false) {} //初始化,调用obj(value)时的赋值
}; void skip_non_blank_char()
{
while(isspace(*ptr)) ptr++;
//isspace(char) distinguish空格/回车/制表符等
} char peek_char()
{
skip_non_blank_char();
return *ptr;
} char next_char()
{
skip_non_blank_char();
return *ptr++;
//*ptr++:是先取出*ptr的值,再使ptr加1
} string parse_string()
{
next_char(); // "
char c;
bool escape = ; //转义字符 escape char
string token;
while(c = next_char(),)
{
if(!escape)
{
if(c == '"') break;
if(c == '\\')
{
escape = true;
continue;
}
}
else escape = ;
token += c;
}
return token;
} obj* parse_value()
{
if (peek_char() == '{') // an object
{
next_char(); obj* res = new obj(); while()
{
if (peek_char() != '"') break;
string key = parse_string();
next_char(); // :
obj* val = parse_value();
res->child[key] = val;
if(peek_char() == '}') break;
next_char(); // ,
} next_char(); // }
return res;
}
else
{
obj* res = new obj(parse_string());
return res;
}
} int main()
{
// freopen("a.in","r",stdin);
int n,q;
string line;
scanf("%d%d",&n,&q);
getline(cin,line);
json.clear();
for (int i = ; i <= n; i++)
{
getline(cin,line);
json+=line;
}
ptr = json.begin();
obj* root = parse_value(); while (q--)
{
getline(cin,line); obj* cur = root;
string t;
t.clear();
bool not_found = ;
for (int i = ; i <= line.size() ; i++)
{
if (i == line.size() || line[i] == '.')
{
if (!cur->child.count(t))
{
not_found = ;
break;
}
cur = cur->child[t];
t.clear();
}
else t += line[i];
} if (not_found) cout << "NOTEXIST" << endl;
else if (cur->is_obj) cout << "OBJECT" << endl;
else cout << "STRING " << cur->value << endl; }
return ;
}