nyist OJ 35 (表达式求值)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35

直接上代码:

View Code
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 using namespace std;
  5 
  6 const int N = 1001;
  7 char stack[N];
  8 char op[N];
  9 char s[N];
 10 int top;
 11 int top_op;
 12 int compare(char a);
 13 void translate();
 14 void calculator();
 15 
 16 int main()
 17 {
 18     int t;
 19     scanf("%d", &t);
 20     while(t--)
 21     {
 22           translate();
 23           calculator(); 
 24     }
 25     return 0;    
 26 }
 27 
 28 int compare(char a)
 29 {
 30     switch(a)
 31     {
 32              case '+':
 33              case '-':
 34                   return 1;
 35              case '*':
 36              case '/':
 37                   return 2;
 38              case '(':
 39                   return 0;
 40              default:
 41                      return -1;         
 42     }    
 43 }
 44 
 45 void translate()
 46 {
 47      scanf("%s", s);
 48      int len = strlen(s) - 1;
 49      top = -1;
 50      top_op = -1;
 51      for(int i = 0; i < len; i++)
 52      {
 53            if('0' <= s[i] && s[i] <= '9' || s[i] == '.')
 54            {
 55                   top++;
 56                   stack[top] = s[i];       
 57            }  
 58            else if(s[i] == '(')
 59            {
 60                   top_op++;
 61                   op[top_op] = s[i];     
 62            }
 63            else if(s[i] == ')')
 64            {
 65                   while(op[top_op] != '(')
 66                   {
 67                         top++;
 68                         stack[top] = ' ';
 69                         top++;
 70                         stack[top] = op[top_op];
 71                         top_op--;                 
 72                   }   
 73                   top_op--;
 74            }
 75            else if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
 76            {
 77                  top++;
 78                  stack[top] = ' ';
 79                  while(compare(s[i]) <= compare(op[top_op]))
 80                  {
 81                          top++;
 82                          stack[top] = op[top_op];
 83                          top++;
 84                          stack[top] = ' ';
 85                          top_op--;                    
 86                  }     
 87                  top_op++;
 88                  op[top_op] = s[i];
 89            }
 90      }     
 91      while(top_op != -1)
 92      {
 93            top++;
 94            stack[top] = ' ';
 95            top++;
 96            stack[top] = op[top_op];
 97            top_op--;             
 98      }
 99      top++;
100      stack[top] = ' ';
101      top++;
102      stack[top] = '=';
103      top++;
104      stack[top] = '\0';
105 }
106 
107 void calculator()
108 {
109      double d[N];
110      double r1, r2;
111      char a[100];
112      char ch;
113      int k;
114      int top_d = -1;
115      for(int i = 0; i < top; i++)
116      {
117           k = 0;
118           ch = stack[i];
119           while(stack[i] != ' ')
120           {
121                  if(stack[i] == '=')
122                      break;
123                  a[k++] = stack[i];
124                  i++;      
125           }          
126           if('0' <= ch && ch <= '9')
127           {
128                  a[k] = '\0';
129                  top_d++;
130                  d[top_d] = atof(a);       
131           } 
132           else
133           {
134                  switch(ch)
135                  {
136                        case '+':
137                               r2 = d[top_d];
138                               top_d--;
139                               r1 = d[top_d];
140                               d[top_d] = r1 + r2;
141                               break;
142                        case '-':
143                               r2 = d[top_d];
144                               top_d--;
145                               r1 = d[top_d];
146                               d[top_d] = r1 - r2;
147                               break;
148                        case '*':
149                               r2 = d[top_d];
150                               top_d--;
151                               r1 = d[top_d];
152                               d[top_d] = r1 * r2;
153                               break;
154                        case '/':
155                               r2 = d[top_d];
156                               top_d--;
157                               r1 = d[top_d];
158                               d[top_d] = r1 / r2;
159                               break;
160                        default:
161                                break;        
162                  }    
163           }
164      } 
165      printf("%.2lf\n", d[0]);       
166 }
posted @ 2012-08-10 07:07  山路水桥  阅读(478)  评论(0编辑  收藏  举报