hrbust 表达式计算(栈)

分两个栈,一个存运算符号,另一个存数字;

判断符号的优先级,再进行计算。

                                                                        表达式计算
Time Limit: 1000 MS Memory Limit: 10240 K
Total Submit: 1(1 users) Total Accepted: 1(1 users) Special Judge: No
Description

输入一个中缀表达式,要求输出计算的结果,保留到小数点后4为位。

表达式中的数均为非负数,可能为小数,不会出现-2,+2的情况,就是说不会有 1 + - 2、1 * -2、2*+2这样的情况。

数字为整数或者带小数的形式,如12、12.345.

符号定义如下:

加法 + ,减法 - ,乘法 * ,除法 / 。

括号 ( ) 。

优先级定义:

加法和减法优先级相同,乘法和除法的优先级相同,加法和减法的优先级比乘法和除法的优先级

遇到括号,则括号内的运算优先级高,以此类推。

Input

有多组测试数据,测试数据组数不超过2000个。

每组占一行,不超过2000个字符。所含字符为空格,数字,"+", "-", "*", "/" ,"(",")",还有小数点"."。

保证每组测试数据均有解和数据的精度。

Output

对于每组测试数据,输出一行,为表达式计算的结果,结果保留到小数点后2位。

 

Sample Input
1 + 1 + 2
1 - 2.0
(1.0)+2-1*2
37- 89+ 80.295* (86.473)-67*42- (75.077)-5.144- 81.987+ 64.204* (11+ 22- (51-74.867)* (4.737)- (16.017)- 17)/ 23
Sample Output
4.00
-1.00
1.00
4230.69
  1 #include<stdio.h>
  2 #include<string.h>
  3 
  4 double data[1001];//数字栈
  5 char opt[1001];//运算符栈
  6 
  7 double f(int n)//小数的转化
  8 {
  9     double s = 1;
 10     for (int i=0; i<n; i++)
 11     {
 12         s *= 0.1;
 13     }
 14     return s;
 15 }
 16 
 17 int Que(char c)//栈中的符号优先级
 18 {
 19     int x;
 20     switch (c)
 21     {
 22         case '#' : x = 0; break;
 23         case '(' : x = 1; break;
 24         case '+' :
 25         case '-' : x = 2; break;
 26         case '*' :
 27         case '/' : x = 3; break;
 28     }
 29     return x;
 30 }
 31 
 32 int Str(char c)//串中的符号优先级
 33 {
 34     int x;
 35     switch(c)
 36     {
 37         case '#' : x = 0; break;
 38         case '(' : x = 4; break;
 39         case '+' :
 40         case '-' : x = 2; break;
 41         case '*' :
 42         case '/' : x = 3; break;
 43         case ')' : x = 1; break;
 44     }
 45     return x;
 46 }
 47 
 48 int qtop, rtop;
 49 
 50 void Count(char ch[])//运算的实现
 51 {
 52     int i = 0;
 53     qtop = rtop = 0;
 54     int len = strlen(ch);
 55     ch[len] = '#';
 56     ch[len+1] = 0;
 57     opt[++qtop] = '#';
 58     while (ch[i])
 59     {
 60         int flag = 0;
 61         double x = 0;
 62         double y = 0;
 63         int n = 0;
 64         if (ch[i] == ' ')
 65         {
 66             i++;
 67             continue;
 68         }
 69         while (ch[i]>=48 && ch[i]<=57)
 70         {
 71             x = x * 10 + ch[i]- 48;
 72             flag = 1;
 73             i++;
 74         }
 75         if (ch[i] == '.')
 76         {
 77             i++;
 78             while (ch[i]>=48 && ch[i]<=57)
 79             {
 80                 y = y * 10 + ch[i] - 48;
 81                 i++;
 82                 n++;
 83             }
 84             x = x + y * f(n);
 85         }
 86         if (flag)
 87         {
 88             data[++rtop] = x;
 89         }
 90         else//如果是符号,进行优先级判断串中的大,则进栈,否则就运算一次
 91         {
 92             int a = Str(ch[i]);
 93             int b = Que(opt[qtop]);
 94             if (a>b)
 95             {
 96                 opt[++qtop] = ch[i];
 97                 i++;
 98             }
 99             else//运算的过程
100             {
101                 switch(opt[qtop--])
102                 {
103                     case '+' : x = data[rtop-1] + data[rtop];
104                                rtop -= 2;
105                                data[++rtop] = x;
106                                break;
107                     case '-' : x = data[rtop];
108                                x = data[rtop-1] - x;
109                                rtop -= 2;
110                                data[++rtop] = x;
111                                break;
112                     case '*' : x = data[rtop-1] *  data[rtop];
113                                rtop -= 2;
114                                data[++rtop] = x;
115                                break;
116                     case '/' : x = data[rtop];
117                                x = data[rtop-1] / x;
118                                rtop -= 2;
119                                data[++rtop] = x;
120                                break;
121                     case '(' : i++;
122                                break;
123                     case '#' : i++;
124                                break;
125                 }
126             }
127         }
128     }
129     printf("%.2lf\n", data[rtop]);
130 }
131 
132 int main()
133 {
134     char s[2001];
135     while (gets(s))
136     {
137         Count(s);
138     }
139     return 0;
140 }

 

posted @ 2012-11-05 20:26  尔滨之夏  阅读(301)  评论(0编辑  收藏  举报