{ node: 'root', next: [ { node: 'second_root' }, { node: 'second_child', next: [{ node: 'second_child_1', next: { node: 'second_child_1_1' } }, { node: 'second_child_2' }] }, { node: 'third_root', next: { node: 'third_child' , next: [{ node: 'third_child_1', next: { node: 'third_child_1_1' } }, { node: 'third_child_2' }] } } ] }
数组
输出规范
1)数组应被左右中括号括起;
2)数组的元素间由','相隔;
3)各节点在数组中的顺序应和其在输入中出现的次序一致;
4)节点名保证为不超过30个字符的字符串,仅含大小写字母、数字及下划线,输出时应用双引号括起;
5)输出的字符串不应有多余的空格。
{ node: 'root', next: [ { node: 'second_root' }, { node: 'second_child', next: [{ node: 'second_child_1', next: { node: 'second_child_1_1' } }, { node: 'second_child_2' }] }, { node: 'third_root', next: { node: 'third_child' , next: [{ node: 'third_child_1', next: { node: 'third_child_1_1' } }, { node: 'third_child_2' }] } } ] }["root","second_child","third_child"]
看完题目后,本质上就是让我们自己弄个程序来解析json格式数据,突然满脑子都在呼喊编译原理,那我们就尝试用编译原理解决一波吧。
首先数据格式只是json一个小子集,涉及词法简单,不需要搞那么复杂,为了便于处理设计以下变量和函数
不太规范的语法制导翻译
节点 -> { node : 字符串(记录字符串) 子节点(为字符串设置子节点数量) } 返回:无
子节点 -> 空 返回:0
子节点 -> , next : [ 节点 节点列表 ] (返回:节点列表子节点数+1) 或{ 节点 } (返回:1)
节点列表 ->空 返回 1
节点列表 -> , 节点 节点列表 返回:节点列表子节点数+1
其实就三个产生式,写起来不算麻烦,但是太久没写了熟练度有所降低,犯了好多低级错误。
import java.util.*;
public class Main{
//缓冲区操作部分
static char[]buffer;
static int pos;
static void read_in(){
Scanner scan=new Scanner(System.in);
String str="";
while(scan.hasNext())str+=scan.nextLine();
buffer=str.toCharArray();
pos=0;
}
static void scan_brace(){
while(buffer[pos]==' '||buffer[pos]=='\t'||buffer[pos]=='\n')pos++;
}
static boolean scan_char(char c){
scan_brace();
return buffer[pos++]==c;
}
static boolean scan_str(String str){
scan_brace();
char[]crr=str.toCharArray();
for(int i=0;i<crr.length;i++){
if(crr[i]!=buffer[pos++])return false;
}
return true;
}
static char preview(){
scan_brace();
return buffer[pos];
}
static String get_str(){
scan_brace();
scan_char('\'');
String res="";
while(preview()!='\'')res+=buffer[pos++];
pos++;
return res;
}
//数据管理部分
static Mapmap=new HashMap();//记录节点名称出现的次数
static ArrayListarr=new ArrayList();//按次记录出现的节点名称
static void add(String str){
arr.add(str);
}
static void put(String str,int val){
map.put(str,val);
}
static void print(){
int size=arr.size();
boolean first=true;
System.out.print("[");
for(int i=0;i<size;i++){
String temp=arr.get(i);
if(map.get(temp)>1){
if(first){
System.out.print("\""+temp+"\"");
first=false;
}
else System.out.print(",\""+temp+"\"");
}
}
System.out.println("]");
}
//编译部分
static void node(){
scan_char('{');
scan_str("node");
scan_char(':');
String name=get_str();
add(name);
int num=subnode();
put(name,num);
scan_char('}');
}
static int subnode(){
if(preview()==','){
scan_char(',');
scan_str("next");
scan_char(':');
if(preview()=='['){
scan_char('[');
node();
int num=list();
scan_char(']');
return num+1;
}
else{
node();
return 1;
}
}
else return 0;
}
static int list(){
if(preview()==','){
scan_char(',');
node();
return list()+1;
}
else return 0;
}
public static void main(String args[]){
read_in();//读入数据并初始化
node();//编译
print();//输出结果
}
}