题解 P2373 【yyy2015c01的IDE之Call Stack】

· · 题解

这是一道模拟题,有些细节需要注意。

主要思路:

声明一个结构体 \mathrm{'fact'}:里面装一个字符串(函数名)和一个 \mathrm{int} 类型的 \mathrm{vector}

再用一个 \mathrm{'fact'} 类型的 \mathrm{vector} 存储答案,最后输出它的大小即可。

实现细节见代码:

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
struct fact{
    string na;//函数名 
    vector <int> para;//由于不知道参数个数,所以最好用vector存参数类型
};
int n;
vector <fact> ans;//答案
int strcmp(string a,string b)//判断两个字符串是否相同(因为不会用现成函数,所以只好手写strcmp) 
{
    if(a.size()!=b.size())return 0;
    for(int x=0;x<a.size();x++)if(a[x]!=b[x])return 0;
    return 1;
}
vector <int> getpara()//获取参数类型的函数
{
    string p;
    int pc=0;//0:数字,1:字符
    vector <int> para;//各个所输入参数的类型
    getline(cin,p);//由于有空格,所以需要用getline 
    for(int x=0;x<p.size();x++){
        if(p[x]==','||p[x]==')')para.pb(pc),pc=0;//一个参数结束,将它的类型压入vector
        if(p[x]==39)pc=1;//如果有单引号,那么这个参数就是字符类型
    }
    return para;//返回所有参数类型 
}
int main()
{
    cin>>n;
    for(int x=1;x<=n;x++){
        string na;//函数名 
        cin>>na;
        for(int y=0;y<na.size();y++)if(na[y]<'a')na[y]+=32;//都转为小写
        if(strcmp(na,"main"))continue;//判断是否是 "main" 函数
        int same=1;//same:是否重复
        vector <int> para=getpara();//获取参数类型
        for(int y=0;y<ans.size();y++){//和已有答案去重
            fact cmp=ans[y];
            if(cmp.para.size()!=para.size()||!strcmp(cmp.na,na))same=0;//参数个数不同或函数名不同
            else for(int z=0;z<cmp.para.size();z++)
                    if(cmp.para[z]!=para[z])same=0;//参数类型不同
        }
        if(!same||x==1)ans.pb((fact){na,para});//如果不重复或者才调用第一个函数,那就把这个函数压入答案
    }
    cout<<ans.size();
    return 0;
}