CCFCSP认证 2017-09C JSON查询

文章提供了一系列C语言解决的题目代码,主要涉及字符串处理和嵌套对象查询。通过构建map数据结构来存储对象信息,实现了从输入的字符串中查找指定查询的能力。代码包括关键函数如找引号、括号、键值对等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【!!最近写了好多C题,打算先放代码供大家参考,之后再补充题解!!】

题目大意

考点

思路

易错点

收获

满分代码

//1.建立map(非字符串部分可加若干空格,换行符)(嵌套)
//2.查询 查询类型 + 内容 (可能涉及多级查询)

//字符串非空?
//可能会在结束后包含很多无意义的空行,需要全部去掉


#include<bits/stdc++.h>

using namespace std;

const int N=8010;
#define fi first
#define se second
#define pb push_back
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef struct OBJ{
    int neobj;
    string str;
}obj;

map<PSI,obj> mp;
int n,m,idx,row,col,stk[N],stktop;
bool stop;
string req,s;

int find_ref_or_kuoh(){ //找到下一个引号或括号,忽略冒号
    //换行
    int len=s.length();
    if(col>=len){
        getline(cin,s);
        col=0;
        row++;
    }
    while(1){
        len=s.length();
        while(col<len){
            if(s[col]=='"'){
                col++;
                return 1;
            }
            if(s[col]=='{'){
                col++;
                idx++;
                stk[stktop++]=idx;//入栈,方便处理对象嵌套
                return 0;
            }
            col++;
        }
        //找遍了当前字符串,还没有
        getline(cin,s);
        col=0;
        row++;
    }
}

string find_key(bool find_lef){
    //换行
    int len=s.length();
    if(col>=len){
        getline(cin,s);
        col=0;
        row++;
    }
    if(find_lef){
        //先找左引号
        while(1){
            len=s.length();
            bool flag=0;
            while(col<len){
                if(s[col]=='"'){
                    col++;
                    flag=1;
                    break;
                }
                else if(s[col]=='}'){
                    stktop--;

                    if(stktop==0){
                            stop=1;
                            return ".";//已经结束啦

                    }
                }
                col++;
            }
            if(flag)break;
            //找遍了当前字符串,还没有
            getline(cin,s);
            col=0;
            row++;
            if(row>n)return "..";
        }
    }

    //换行
    len=s.length();
    if(col>=len){
        col=0;
        getline(cin,s);
        row++;
    }

    //再遍历整个字符串,直到右引号,注意字符串内部
    string res;
    len=s.length();
    while(col<len){
        if(s[col]=='"'){
            col++;
            return res;
        }
        if(s[col]=='\\'){ //反斜杠特殊处理
            res+=s[++col];
            col++;
        }
        else res+=s[col++];
    }
    return res;

}

bool sol(){

    int len=req.length(),i=0,cur=1;
    string ans;
    while(i<len){
        string v;
        while(i<len && req[i]!='.')v+=req[i++];
        if(!mp.count({v,cur}))return 0;
        if(mp[{v,cur}].neobj>=0)cur=mp[{v,cur}].neobj;
        else{
            if(i<len)return 0;//已经找到字符串,但是请求还未结束
            cout<<"STRING "<<mp[{v,cur}].str<<endl;
            return 1;
        }
        i++;
    }
    cout<<"OBJECT\n";
    return 1;
}


int main(){
    cin>>n>>m;
    char c=getchar();//吃掉换行符
    if(n){
        getline(cin,s);
        row++;
        col=0;
        find_ref_or_kuoh();//先找到第一个左花括号
    }
    //循环,每轮找一个键值对
    int op;
    while(row<=n){
        string skey;
        obj val;


        skey=find_key(1);//找键值,自动跳过右引号,自动识别右括号
        int cur=stk[stktop-1];//记录当前对象
        //cout<<row<<" "<<col<<" "<<skey<<endl;
        if(stop){
            while(row<n)//当还没读完n行
            {

                    getline(cin,s);
                    row++;
            }
            break;
        }
        op=find_ref_or_kuoh();

        if(op){ //值为字符串
            val.str=find_key(0);
            if(row>n)break;
            val.neobj=-1;
        }
        else{//值为对象
            val.neobj=stk[stktop-1];//记录该对象的序号
        }
        mp[{skey,cur}]=val;
        //cout<<skey<<" "<<cur<<" "<<val.neobj<<" "<<val.str<<endl;
    }
    while(m--){
        cin>>req;
        if(!sol())cout<<"NOTEXIST\n";
    }
    return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值