1. 程式人生 > >[csp-201709-3]JSON查詢-編譯原理

[csp-201709-3]JSON查詢-編譯原理

宣告:這個程式碼幾乎完全就是照抄hyh學長的!!!

有什麼問題我會刪掉這篇的emm

當初面試的時候我的方向就是編譯原理...然後學長髮了個1400+的程式碼實現一個簡化的c編譯器...沒看懂qaq

感覺很多知識還是很缺失的emm(當初連高維陣列是怎麼存的都不知道啊!指標幾乎完全不會用啊!更別說什麼函式怎麼層層遞迴 變數怎麼層層宣告的現在總算是懂了JSON這個呀越發覺得這個程式碼寫得很美妙啊hhh

先發一下題面:

 題意:

一段JSON結構的程式碼

一種是 字串  名稱-鍵值 “ ” : “ ”

一種是 物件(有物件名){}

物件裡面可以是多個字串,或者是巢狀的物件。

題解:

應該算是很典型的編譯原理類題目吧

這個層層巢狀的物件怎麼實現呢?其實是定義一個object型別,然後用每個物件用指標指向,一層層巢狀。有這個大概的想法可能不難,難點應該是在於這個程式碼怎麼實現。

這個也是提醒我打之前要想好每個函式的作用,要準確清晰,不然會越打越混亂,無限debug。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 
  4 string json;
  5 string::iterator ptr;
  6 
  7 struct obj
  8 {
  9     map<string, obj *> child;
10 11 string value; 12 13 bool is_obj; 14 15 obj() : is_obj(true) {} 16 obj(const string &value) : value(value),is_obj(false) {} //初始化,呼叫obj(value)時的賦值 17 }; 18 19 void skip_non_blank_char() 20 { 21 while(isspace(*ptr)) ptr++; 22 //isspace(char) distinguish空格/回車/製表符等
23 } 24 25 char peek_char() 26 { 27 skip_non_blank_char(); 28 return *ptr; 29 } 30 31 char next_char() 32 { 33 skip_non_blank_char(); 34 return *ptr++; 35 //*ptr++:是先取出*ptr的值,再使ptr加1 36 } 37 38 string parse_string() 39 { 40 next_char(); // " 41 char c; 42 bool escape = 0; //轉義字元 escape char 43 string token; 44 while(c = next_char(),1) 45 { 46 if(!escape) 47 { 48 if(c == '"') break; 49 if(c == '\\') 50 { 51 escape = true; 52 continue; 53 } 54 } 55 else escape = 0; 56 token += c; 57 } 58 return token; 59 } 60 61 obj* parse_value() 62 { 63 if (peek_char() == '{') // an object 64 { 65 next_char(); 66 67 obj* res = new obj(); 68 69 while(1) 70 { 71 if (peek_char() != '"') break; 72 string key = parse_string(); 73 next_char(); // : 74 obj* val = parse_value(); 75 res->child[key] = val; 76 if(peek_char() == '}') break; 77 next_char(); // , 78 } 79 80 next_char(); // } 81 return res; 82 } 83 else 84 { 85 obj* res = new obj(parse_string()); 86 return res; 87 } 88 } 89 90 int main() 91 { 92 // freopen("a.in","r",stdin); 93 int n,q; 94 string line; 95 scanf("%d%d",&n,&q); 96 getline(cin,line); 97 json.clear(); 98 for (int i = 1; i <= n; i++) 99 { 100 getline(cin,line); 101 json+=line; 102 } 103 ptr = json.begin(); 104 obj* root = parse_value(); 105 106 107 108 while (q--) 109 { 110 getline(cin,line); 111 112 obj* cur = root; 113 string t; 114 t.clear(); 115 bool not_found = 0; 116 for (int i = 0; i <= line.size() ; i++) 117 { 118 if (i == line.size() || line[i] == '.') 119 { 120 if (!cur->child.count(t)) 121 { 122 not_found = 1; 123 break; 124 } 125 cur = cur->child[t]; 126 t.clear(); 127 } 128 else t += line[i]; 129 } 130 131 if (not_found) cout << "NOTEXIST" << endl; 132 else if (cur->is_obj) cout << "OBJECT" << endl; 133 else cout << "STRING " << cur->value << endl; 134 135 } 136 return 0; 137 }