NYOJ128前缀式计算

 

前缀式计算

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述

先说明一下什么是中缀式:

如2+(3+4)*5这种我们最常见的式子就是中缀式。

而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))

然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )

把括号去掉就是:+ 2 * + 3 4 5

最后这个式子就是该表达式的前缀表示。

给你一个前缀表达式,请你计算出该前缀式的值。

比如:

+ 2 * + 3 4 5的值就是 37

 
输入
有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
以EOF为输入结束的标志。
输出
对每组数据,输出该前缀表达式的值。输出结果保留两位小数。
样例输入
+ 2 * + 3 4 5
+ 5.1 / 3 7
样例输出
37.00
5.53


 1 /* 功能Function Description:        NYOJ-128前缀式计算
 2    开发环境Environment:                DEV C++ 4.9.9.1
 3    技术特点Technique:
 4    版本Version:
 5    作者Author:                        可笑痴狂
 6    日期Date:                        20120804
 7    备注Notes:      
 8 */
 9 #include<cstdio>
10 #include<stack>
11 #include<cstring>
12 #include<cctype>
13 #include<cstdlib>
14 using namespace std;
15 
16 char s[2000];
17 int len;
18 
19 void cal()
20 {
21     int i,t,j,k,n,flag;
22     char tmp[100];
23     double a,b;
24     stack<double> Opnd;
25     for(i=len-1;i>=0;)
26     {
27         if(isdigit(s[i]))
28         {
29             j=i;
30             t=0;
31             a=0;
32             n=1;
33             flag=0;
34             memset(tmp,'\0',sizeof(tmp));
35             while(s[i]!=' ')
36                 --i;
37             k=i+1;
38             for(;k<=j;++k)
39             {
40                 if(isdigit(s[k]))
41                 {
42                     a=a*10+s[k]-'0';
43                     if(flag)
44                         n*=10;
45                 }
46                 else
47                     flag=1;
48             }
49             Opnd.push(a/n);
50         }
51         else if(s[i]==' ')
52             --i;
53         else
54         {
55             a=Opnd.top();
56             Opnd.pop();
57             b=Opnd.top();
58             Opnd.pop();
59             switch (s[i])
60             {
61                 case '+':
62                     Opnd.push(a+b);
63                     break;
64                 case '-':
65                     Opnd.push(a-b);
66                     break;
67                 case '*':
68                     Opnd.push(a*b);
69                     break;
70                 default:
71                     Opnd.push(a/b);
72                     break;
73             }
74             --i;
75         }
76     }
77     printf("%.2lf\n",Opnd.top());
78 }
79 
80 int main()
81 {
82     while(gets(s))
83     {
84         len=strlen(s);
85         cal();
86     }
87     return 0;
88 }
 1 //代码二:------神一般的代码----不过只能测试一组测试数据,要改成多组不会改
 2 #include <stdio.h>
 3 #include<math.h>
 4 #include<stdlib.h>
 5 
 6 double exp()
 7 {
 8     char a[10];
 9     scanf("%s", a);
10     switch(a[0])
11     {
12         case'+': return exp( ) + exp( );
13         case'-': return exp( ) - exp( );
14         case'*': return exp( ) * exp( );
15         case'/': return exp( ) / exp( );
16         default: return atof(a);
17     }
18 }
19 int main()
20 {
21     double ans;
22     ans=exp();
23     printf("%.2f\n", ans);
24     return 0;
25 }
功不成,身已退
原文地址:https://www.cnblogs.com/dongsheng/p/2622817.html