7-20 表达式转换 (25 分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
输出样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| #include<stdio.h> #include<stdlib.h> #include<string.h>
int IsNum( char c); int IsZhengfu( char c); int Compare( char a, char b);
int main() { char str1[21]; char str2[21]; int len; int flag =0; int i,j; int space =0;
scanf("%s",str1); len = strlen(str1);
for( i=0; i<len; i++) { if(IsNum(str1[i])) { if( space ) { printf(" "); space = 0; } printf("%c",str1[i]); } else if( IsZhengfu(str1[i]) && (i? !IsNum(str1[i-1]) && str1[i-1]!=')':1)) { if( str1[i]=='-') { if(space) { printf(" "); space = 0; } printf("%c",str1[i]); } } else { if( flag) { if( str1[i]==')') { while( flag--) { if(str2[flag]=='(') break; printf(" %c",str2[flag]); } } else { while( flag ) { if( Compare( str2[flag-1],str1[i])) { printf(" %c",str2[--flag]); } else break; } str2[flag++] = str1[i]; } } else str2[flag++] = str1[i]; for ( j=0; j<flag; j++) { if( str2[j]!='(') { space = 1; break; } } } } while (flag) { printf(" %c",str2[--flag]); }
return 0; }
int IsNum( char c) { return ( c >='0'&&c<='9')||c=='.'; }
int IsZhengfu( char c) { return c=='+' || c=='-'; }
int Compare( char a, char b) { if( b==')') return 1; if( b=='(' || a=='(') return 0;
switch(b) { case '+': case '-': return 1; case '*': case '/': switch(a) { case '+': case '-': return 0; case '*': case '/': return 1; }
} }
|