hrbust 表达式计算(栈)
分两个栈,一个存运算符号,另一个存数字;
判断符号的优先级,再进行计算。
表达式计算 | |||||
|
|||||
Description | |||||
输入一个中缀表达式,要求输出计算的结果,保留到小数点后4为位。 表达式中的数均为非负数,可能为小数,不会出现-2,+2的情况,就是说不会有 1 + - 2、1 * -2、2*+2这样的情况。 数字为整数或者带小数的形式,如12、12.345. 符号定义如下: 加法 + ,减法 - ,乘法 * ,除法 / 。 括号 ( ) 。 优先级定义: 加法和减法优先级相同,乘法和除法的优先级相同,加法和减法的优先级比乘法和除法的优先级低。 遇到括号,则括号内的运算优先级高,以此类推。 |
|||||
Input | |||||
有多组测试数据,测试数据组数不超过2000个。 每组占一行,不超过2000个字符。所含字符为空格,数字,"+", "-", "*", "/" ,"(",")",还有小数点"."。 保证每组测试数据均有解和数据的精度。 |
|||||
Output | |||||
对于每组测试数据,输出一行,为表达式计算的结果,结果保留到小数点后2位。
|
|||||
Sample Input | |||||
1 + 1 + 2 1 - 2.0 (1.0)+2-1*2 37- 89+ 80.295* (86.473)-67*42- (75.077)-5.144- 81.987+ 64.204* (11+ 22- (51-74.867)* (4.737)- (16.017)- 17)/ 23 |
|||||
Sample Output | |||||
4.00 -1.00 1.00 4230.69 1 #include<stdio.h> 2 #include<string.h> 3 4 double data[1001];//数字栈 5 char opt[1001];//运算符栈 6 7 double f(int n)//小数的转化 8 { 9 double s = 1; 10 for (int i=0; i<n; i++) 11 { 12 s *= 0.1; 13 } 14 return s; 15 } 16 17 int Que(char c)//栈中的符号优先级 18 { 19 int x; 20 switch (c) 21 { 22 case '#' : x = 0; break; 23 case '(' : x = 1; break; 24 case '+' : 25 case '-' : x = 2; break; 26 case '*' : 27 case '/' : x = 3; break; 28 } 29 return x; 30 } 31 32 int Str(char c)//串中的符号优先级 33 { 34 int x; 35 switch(c) 36 { 37 case '#' : x = 0; break; 38 case '(' : x = 4; break; 39 case '+' : 40 case '-' : x = 2; break; 41 case '*' : 42 case '/' : x = 3; break; 43 case ')' : x = 1; break; 44 } 45 return x; 46 } 47 48 int qtop, rtop; 49 50 void Count(char ch[])//运算的实现 51 { 52 int i = 0; 53 qtop = rtop = 0; 54 int len = strlen(ch); 55 ch[len] = '#'; 56 ch[len+1] = 0; 57 opt[++qtop] = '#'; 58 while (ch[i]) 59 { 60 int flag = 0; 61 double x = 0; 62 double y = 0; 63 int n = 0; 64 if (ch[i] == ' ') 65 { 66 i++; 67 continue; 68 } 69 while (ch[i]>=48 && ch[i]<=57) 70 { 71 x = x * 10 + ch[i]- 48; 72 flag = 1; 73 i++; 74 } 75 if (ch[i] == '.') 76 { 77 i++; 78 while (ch[i]>=48 && ch[i]<=57) 79 { 80 y = y * 10 + ch[i] - 48; 81 i++; 82 n++; 83 } 84 x = x + y * f(n); 85 } 86 if (flag) 87 { 88 data[++rtop] = x; 89 } 90 else//如果是符号,进行优先级判断串中的大,则进栈,否则就运算一次 91 { 92 int a = Str(ch[i]); 93 int b = Que(opt[qtop]); 94 if (a>b) 95 { 96 opt[++qtop] = ch[i]; 97 i++; 98 } 99 else//运算的过程 100 { 101 switch(opt[qtop--]) 102 { 103 case '+' : x = data[rtop-1] + data[rtop]; 104 rtop -= 2; 105 data[++rtop] = x; 106 break; 107 case '-' : x = data[rtop]; 108 x = data[rtop-1] - x; 109 rtop -= 2; 110 data[++rtop] = x; 111 break; 112 case '*' : x = data[rtop-1] * data[rtop]; 113 rtop -= 2; 114 data[++rtop] = x; 115 break; 116 case '/' : x = data[rtop]; 117 x = data[rtop-1] / x; 118 rtop -= 2; 119 data[++rtop] = x; 120 break; 121 case '(' : i++; 122 break; 123 case '#' : i++; 124 break; 125 } 126 } 127 } 128 } 129 printf("%.2lf\n", data[rtop]); 130 } 131 132 int main() 133 { 134 char s[2001]; 135 while (gets(s)) 136 { 137 Count(s); 138 } 139 return 0; 140 }
|