问题描述 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,可以用来描述半结构化的数据。JSON 格式中的基本单元是值 (value),出于简化的目的本题只涉及 2 种类型的值: 输入格式 第一行是两个正整数 n 和 m,分别表示 JSON 数据的行数和查询的个数。 输出格式 对于输入的每一个查询,按顺序输出查询结果,每个结果占一行。 样例输入 10 5 样例输出 STRING John 评测用例规模与约定 n ≤ 100,每行不超过 80 个字符。 |
80分
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
#include <stack>
using namespace std;
struct JSON {
string Name, Value = "#";
vector<JSON> Son;
};
string Find(vector<JSON> All, string S, int start)
{
int i, j;
string result = "NOTEXIST";
int end = S.find('.');
S[end] = '#';
string Com = S.substr(start, end - start);
for (i = 0; i < All.size(); i++)
{
if (Com == All[i].Name)
{
if (S.find('.') != -1)
return Find(All[i].Son, S, end + 1);
else
{
for (j = 0; j < All[i].Son.size(); j++)
{
if (All[i].Son[j].Name == S.substr(end + 1,
All.size()- end - 1))
{
if (All[i].Son[j].Value == "#")
result = "OBJECT";
else
result = "STRING " + All[i].Son[j].Value;
break;
}
}
}
break;
}
}
return result;
}
int main()
{
int i, j, N, M;
cin >> N >> M; // JSON 数据的行数和查询的个数
cin.ignore(); //忽略有N,M的第一行
string S;
JSON Save, Front, Kong;
vector<JSON>Data;
stack<string>Mum;
stack<JSON>Qian;
int Flag_Object = 0, Flag_String = 0, start, end;
for (i = 0; i < N; i++)
{
getline(cin, S);
int Num_Xie = 0, Num_All = S.size();
for (j = 0; j < Num_All - Num_Xie; j++)
{
switch (S[j])
{
case '{': Flag_Object++; Flag_String = 0;
Qian.push(Front); Front.Son.clear(); break;
case '}':
Flag_Object--;
if (Mum.size() == 0)
Data.push_back(Save);
else
{
Front.Son.push_back(Save);
Front.Name = Mum.top();
Mum.pop();
Front.Value = "#"; //代表为对象
Save = Front;
Front = Qian.top();
Qian.pop();
//Front = Qian.top();
}
break;
case ',':
if (Mum.size() == 0)
{
Data.push_back(Save);
}
else
Front.Son.push_back(Save);
break;
case '\\':
if (Flag_String < 10)
{
Flag_String += 10; Num_Xie++; S.erase(j--, 1);
}
else
Flag_String -= 10; //忽略偶数个'\'
break;
case '"':
if (Flag_String == 0)
{
start = j;
Flag_String = 1;
}
else if (Flag_String == 1)
{
end = j;
Flag_String = 2;
Mum.push(S.substr(start + 1, end - start - 1));
}
else if (Flag_String == 2)
{
start = j;
Flag_String = 3;
}
else if (Flag_String == 3)
{
end = j;
Flag_String = 0;
Save.Value = S.substr(start + 1, end - start - 1);
Save.Name = Mum.top();
Save.Son.clear();
Mum.pop();
}
else if (Flag_String > 10) //忽略当前"
{
Flag_String -= 10;
}
break;
}
}
}
for (i = 0; i < M; i++)
{
getline(cin, S);
string Result = "NOTEXIST";
if (S.find('.') != -1) //查询字符串中有'.'
{
Result = Find(Data, S, 0);
}
else //查询字符串中无'.'
{
for (j = 0; j < Data.size(); j++)
{
if (Data[j].Name == S)
{
if (Data[j].Value == "#")
Result = "OBJECT";
else
Result = "STRING " + Data[j].Value;
break;
}
}
}
cout << Result << endl;
}
return 0;
}