题意:给出一个C语言加减法表达式,求出这个表达式的最终结构,以及各个变量的值,每个变量保证至出现一次,保证输入的字符串合法;
输入:一串包含+、-和小写的26个英文字母;
输出:表达式的结果,以及表达式中各变量的最终值;
解题思路:一个合法的C语言表达式,只包含空格、操作符(+、-)、变量(a-z);首先要处理前缀(+、-)和后缀(+、-)使表达式可以计算;在处理前缀和后缀问题时要注意前后缀与变量之间的空格,像表达式(++ a- --b +c --)是合法的;所以可以用两个数组(char int)模拟两个栈,分别用来存放操作符以及变量值,然后再用一个数组(int)来记录变量的前后缀以及变量是否在表达式里出现过。然后先考虑空格,再考虑变量(如果是变量则有可能后缀+、-),最后考虑操作符(如果是操作符则有可能前缀+、-);至此思路就清晰了。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<ctype.h> 5 #define MAXN 1000 6 using namespace std; 7 8 int num[26];//记录出现过的字符; 9 char str[MAXN]; 10 char data1[MAXN];//记录操作符; 11 int data[MAXN];//记录变量值; 12 13 int main(){ 14 int n,i,len; 15 while(gets(str)){ 16 for(i=0;i<27;i++)num[i]=-MAXN; 17 int cnt=0,cnt1=0,flag=0; 18 len=strlen(str); 19 for(i=0;i<len;i++){ 20 if(str[i]==' ')continue; 21 else if(isalpha(str[i])){ 22 flag=str[i]-'a'+1;//标记有字符出现; 23 data[cnt++]=str[i]-'a'+1; 24 num[str[i]-'a']=0; 25 } 26 else { 27 if(str[i+1]==str[i]){//连续两个操作符; 28 if(!flag){//没有字符出现的情况; 29 int j; 30 for(j=i+2;j<len;j++) 31 if(isalpha(str[j]))break; 32 if(str[i]=='-'){ 33 data[cnt++]=str[j]-'a'; 34 num[str[j]-'a']=-1; 35 } 36 else { 37 data[cnt++]=str[j]-'a'+2; 38 num[str[j]-'a']=1; 39 } 40 i=j; 41 } 42 else {//有字符出现的情况; 43 if(str[i]=='-')num[flag-1]=-1; 44 else num[flag-1]=1; 45 data[cnt]=flag; 46 i++; 47 } 48 } 49 else data1[cnt1++]=str[i]; 50 flag=0;//更新标志; 51 } 52 } 53 int sum=0,t=1,j=0; 54 printf("Expression: %s\n",str); 55 for(i=0;i<cnt;i++){ 56 sum+=data[i]*t; 57 if(data1[j++]=='-')t=-1; 58 else t=1; 59 } 60 printf(" value = %d\n",sum); 61 for(int i=0;i<26;i++) 62 if(num[i]>=-1)printf(" %c = %d\n",i+'a',1+i+num[i]); 63 } 64 return 0; 65 }
浙公网安备 33010602011771号