带括号表达式
递归+两个栈,一个存符号一个存数字,判断符号的优先级 +,- < *,/ < )
in
(111+999)/20+111
(111+333*3)/(20+80)-(111+999)/20+111
(1+(2+(3+4*5)-10000
out
166.500000
66.6000000
-9974.000000
View Code
1 #include <string> 2 #include <fstream> 3 #include <iostream> 4 using namespace std; 5 6 7 bool valid = true, Found = false; 8 string buf; 9 int hash[8], dat[8]; 10 int rank[128] = {0}; 11 12 double num(const char*& e) 13 { 14 int n(0); 15 double x(0.); 16 if (1 == sscanf(e, "%lg%n", &x, &n)) e += n; else valid = false; 17 return x; 18 } 19 double calc(double x, char op, double y) 20 { 21 switch (op) 22 { 23 case '+': return (x + y); 24 case '-': return (x - y); 25 case '*': return (x * y); 26 case '/': 27 if (y) return (x / y); 28 else { 29 valid = false; 30 return 0.; 31 } 32 } 33 return 0.; 34 } 35 double eval(const char*& e) { 36 double stack[32]; 37 char ops[32]; 38 int top(0); 39 while (valid && *e && *e != ')') { 40 if ('(' == *e) { 41 ++ e; 42 stack[top] = eval(e); 43 if (*e ++ != ')') valid = false; 44 } 45 else stack[top] = num(e); 46 if (!*e || ')' == *e) break; 47 if (rank[*e]) { 48 while (top > 0 && rank[ops[top - 1]] >= rank[*e]) { 49 -- top; 50 stack[top] = calc(stack[top], ops[top], stack[top + 1]); 51 } 52 ops[top ++] = *e ++; 53 } 54 else valid = false; 55 } 56 while (top --) stack[top] = calc(stack[top], ops[top], stack[top + 1]); 57 return (*stack); 58 } 59 int main (void) 60 { 61 rank['+'] = rank['-'] = 1; 62 rank['*'] = rank['/'] = 2; 63 cin >> buf; 64 const char *x = buf.c_str(); 65 printf("%lf\n",eval(x)); 66 return 0; 67 }


浙公网安备 33010602011771号