2694:逆波兰表达式,考点:递归
原题:http://bailian.openjudge.cn/practice/2694/
描述
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出
输出为一行,表达式的值。
可直接用printf("%f\n", v)输出表达式的值v。
样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000
解法
思路:递归调用,坑——最后输出的精度问题
一开始自己写的版本,比较冗余,整体输入再递归,主要是为了熟悉一下字符串的各种操作。
1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 #include <iomanip> 5 using namespace std; 6 int n; 7 char input[10000][100]; 8 double calculate() 9 { 10 if (strcmp(input[n], "*")==0) { 11 n++; 12 double factora = calculate(); 13 n++; 14 double factorb = calculate(); 15 return factora * factorb; 16 } 17 else if (strcmp(input[n], "+")==0) { 18 n++; 19 double factora = calculate(); 20 n++; 21 double factorb = calculate(); 22 return factora + factorb; 23 } 24 else if (strcmp(input[n], "/") == 0) { 25 n++; 26 double factora = calculate(); 27 n++; 28 double factorb = calculate(); 29 return factora / factorb; 30 } 31 else if (strcmp(input[n], "-") == 0) { 32 n++; 33 double factora = calculate(); 34 n++; 35 double factorb = calculate(); 36 return factora - factorb; 37 } 38 else 39 return atof(input[n]); 40 } 41 int main() 42 { 43 memset(input, 0, sizeof(input)); 44 char strings[10000]; 45 cin.getline(strings, 10000); 46 int len = strlen(strings); 47 int i = 0, indexi = 0; 48 for (int j = 0; j < len; j++) 49 { 50 if (strings[j] != ' ') 51 { 52 input[i][indexi++] = strings[j]; 53 } 54 else { 55 input[i++][indexi] = '\0'; 56 indexi = 0; 57 } 58 } 59 input[i][indexi] = '\0'; 60 n = 0; 61 cout << fixed << setprecision(6) << calculate() << endl; 62 return 0; 63 }
最后提交的版本,边递归边读输入,非常简短
1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 double cal() { 5 char temp[10]; 6 cin >> temp; 7 if (temp[0] <= '9'&&temp[0] >= '0') 8 return atof(temp); 9 else { 10 double factora = cal(); 11 double factorb = cal(); 12 switch (temp[0]) { 13 case '*':return factora * factorb; 14 case '/':return factora / factorb; 15 case '+':return factora + factorb; 16 case '-':return factora - factorb; 17 } 18 } 19 } 20 int main() 21 { 22 cout << fixed << setprecision(6) << cal() << endl; 23 }

浙公网安备 33010602011771号