题解 P2373 【yyy2015c01的IDE之Call Stack】
这是一道模拟题,有些细节需要注意。
主要思路:
声明一个结构体
再用一个
-
判断是否重复:如果参数个数一样,函数名字相同,且每个参数类型相同,那么这两个函数就相同。
-
可以单独写函数来输入并处理参数,这样程序可读性更高。
实现细节见代码:
#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;
}