游客 Signup | Login
中文 | En

1806 - 前缀式计算

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

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

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

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

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

最后这个式子就是该表达式的前缀表示,它的优势是运算优先级不需要用括号来额外说明。。

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

比如:

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

Input

有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
以EOF为输入结束的标志。

Output

对每组数据,输出该前缀表达式的值。输出结果保留两位小数。

Examples

Input

+ 2 * + 3 4 5
+ 5.1 / 3 7

Output

37.00
5.53

Solution C

#include<stdio.h>  
#include<stdlib.h>  
char a[505];  
double fun()  
{  
    if(scanf("%s",a)==EOF)  
        return -65535;  
    if(a[0]=='+')  
        return fun()+fun();  
    if(a[0]=='-')  
        return fun()-fun();  
    if(a[0]=='*')  
        return fun()*fun();  
    if(a[0]=='/')  
        return fun()/fun();  
    return atof(a); 
}  
int main()  
{ 
	while(1){
        double jieguo=fun(); 
		  if(jieguo>-65534)
            printf("%.2lf\n",jieguo);  
		  else 
			  break;
	}
       return 0;
   
}  

Solution C++

#include <cstdio>
#include <cstdlib>
#include <stack>
#include <cstring>
using namespace std;
double val(char s, double a, double b){
    switch(s){
    case '+':
        return a+b;
    case '-':
        return a-b;
    case '*':
        return a*b;
    case '/':
        return a/b;
    }
}
int main(){
    int i,dot,len;
    char s[1200];
    double m,x,y;
    stack<double> a;
    while(gets(s)){
        for(i=strlen(s)-1;i>=0;i--){
            while(s[i-1]!=' '&&i>0) i--;
            if(s[i]<='9'&&s[i]>='0')
                a.push(atof(&s[i]));
            else{
                x=a.top();a.pop();
                y=a.top();a.pop();
                a.push(val(s[i],x,y));
            }
        }
        printf("%.2f\n",a.top());
        a.pop();
    }
    return 0;
}
Time Limit 3 seconds
Memory Limit 128 MB
Discuss Stats
上一题 下一题