1、终于AC了~WA了快十次了。。。好吧我激动了~按照惯例,还是分点说一下得到的经验。
2、本题虽然在“二叉树”分类里,但我觉得逐字符处理更方便。注意原式中有好多空格,预处理的时候要消去。否则在判断加减号是否是前后缀的时候非常麻烦!!!
3、注意访问的时候不要越界,比如i=0时就不要访问a【i-1】,我就是因为这个错了一次。
4、注意“表达式的值”的定义。++a的值为2而a++的值为1。
5、如果还通不过的话,试一试a++---b这个表达式,应为0。
#include<cstdio>
#include<cctype>
#include<cstring>
int main(){
//freopen("a.txt","r",stdin)
char s[120],stemp[120];
int a[27],vis[27];
while(fgets(stemp,120,stdin)!=NULL){
if(stemp[0]=='\n') break;
int p=0,q=0;
while(stemp[p]){
if(stemp[p]==' ') p++;
else{
s[q++]=stemp[p];
p++;
}
}
int i=0,ans=0,flag=1;
for(int i=1;i<=26;i++)
a[i]=i;
memset(vis,0,sizeof(vis));
while(s[i]!='\n'){
if(isspace(s[i])) i++;
if(isalpha(s[i])) {ans+=flag?a[s[i]-'a'+1]:-a[s[i]-'a'+1];vis[s[i]-'a'+1]=1;}
if(s[i]=='+'&&i){
if(s[i-1]!='+'&&s[i+1]!='+'||i>=3&&isalpha(s[i-3])&&s[i-2]==s[i-1]||isalpha(s[i+3])&&s[i+1]==s[i+2]) flag=1;
else if(isalpha(s[i-1])&&s[i+1]=='+') {a[s[i-1]-'a'+1]++;}
else if(s[i-1]=='+'&&isalpha(s[i+1])) a[s[i+1]-'a'+1]++;
}
if(s[i]=='-'&&i){
if(s[i-1]!='-'&&s[i+1]!='-'||i>=3&&isalpha(s[i-3])&&s[i-2]==s[i-1]||isalpha(s[i+3])&&s[i+1]==s[i+2]) flag=0;
else if(isalpha(s[i-1])&&s[i+1]=='-') {a[s[i-1]-'a'+1]--;}
else if(s[i-1]=='-'&&isalpha(s[i+1])) a[s[i+1]-'a'+1]--;
}
i++;
}
printf("Expression: %s",stemp);
printf(" value = %d\n",ans);
for(int i=1;i<=26;i++)
if(vis[i])
printf(" %c = %d\n",i+'a'-1,a[i]);
}
return 0;
}