试题编号: | 201709-3 |
试题名称: | JSON查询 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,可以用来描述半结构化的数据。JSON 格式中的基本单元是值 (value),出于简化的目的本题只涉及 2 种类型的值: 输入格式 第一行是两个正整数 n 和 m,分别表示 JSON 数据的行数和查询的个数。 输出格式 对于输入的每一个查询,按顺序输出查询结果,每个结果占一行。 样例输入 10 5 样例输出 STRING John 评测用例规模与约定 n ≤ 100,每行不超过 80 个字符。
|
本题这里的解法采用有限状态自动机的思想来编写程序,出现某种语法成分后进入到某一种状态,在某种状态下则做相应的处理。对于文本处理来说,用有限状态自动机的原理进行处理是是否有效的。程序中有三种状态,另外用变量来辅助,最后实现对JSON文本的处理。这种处理是简易的,语法上未必是严密的,虽然能够得100分。
文本处理问题也可以用正则表达式来处理,但是其本质(背后的处理)也是有限状态自动机。
同时由于输入文本中有多层{}结构,所以需要堆栈上一层的键值;
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <stack>
using namespace std;
map<string, string> mp;
int state = 0;
bool isstr = false;
stack<string> keys;
string key;
void handle(string &x)
{
int i;
string tmp;
for (i = 0; i<x.size(); i++)
{
if (x[i] == '{')
{
if (state == 2)//遇到:号
{
state = 3;
keys.push(key);//上一层的键值入栈
}
else
{
state = 1;
keys.push(key);
}
}
if (x[i] == '}')
{
keys.pop();
state = 1;
}
else if (x[i] == ':')
{
state = 2;
}
else if (x[i] == ',')
{
state = 1;
}
else if (x[i] == '"'&&isstr == false)//第一个" 打开取字符串
{
isstr = true;
}
else if (x[i] == '"'&&isstr == true)//第二个” 关闭取字符串
{
isstr = false;
}
if (isstr == true)//已经遇到第一个 ”,进入处理字符串
{
for (i = i + 1; x[i] != '"'; i++)
{
if (x[i] == '\\' && (x[i + 1] == '\"' || x[i + 1] == '\\'))i++;
tmp.push_back(x[i]);
}
i--;
if (state == 1)
{
if (!(keys.top().empty()))key = keys.top() + "." + tmp;//上一层的
else key = tmp;
tmp.clear();
}
else if (state == 2)
{
mp[key] = "STRING "+tmp;
tmp.clear();
}
else if (state == 3)
{
mp.insert(pair<string, string>(key, "OBJECT"));
key += "." + tmp;
tmp.clear();
}
}
}
}
int main()
{
int n, m, i;
string tem;
cin >> n >> m;
getline(cin, tem);
for (i = 0; i<n; i++)
{
getline(cin, tem);
handle(tem);
}
for (i = 0; i<m; i++)
{
cin >> tem;
cout << (mp[tem] == "" ? "NOTEXIST" : mp[tem]) << endl;
}
cin >> i;
}