题意:给出一个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 }
View Code

 

posted on 2013-08-09 13:09  xien0  阅读(659)  评论(0)    收藏  举报