带括号表达式

递归+两个栈,一个存符号一个存数字,判断符号的优先级 +,- <  *,/  <  )

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 }
posted @ 2012-08-20 20:43  Wheat″  阅读(155)  评论(0)    收藏  举报