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 }

你可能感兴趣的:(表达式)