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

聲明:這個代碼幾乎徹底就是照抄hyh學長的!!!c++

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

當初面試的時候個人方向就是編譯原理...而後學長髮了個1400+的代碼實現一個簡化的c編譯器...沒看懂qaqjson

感受不少知識仍是很缺失的emm(當初連高維數組是怎麼存的都不知道啊!指針幾乎徹底不會用啊!更別說什麼函數怎麼層層遞歸 變量怎麼層層聲明的如今總算是懂了JSON這個呀愈加以爲這個代碼寫得很美妙啊hhh數組

先發一下題面:
函數

 

 題意:ui

一段JSON結構的代碼spa

一種是 字符串  名稱-鍵值 「 」 : 「 」debug

一種是 對象(有對象名){}指針

對象裏面能夠是多個字符串,或者是嵌套的對象。code

 

題解:

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

這個層層嵌套的對象怎麼實現呢?實際上是定義一個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 }
相關文章
相關標籤/搜索