1806 - 前缀式计算
时间限制 : 3 秒
内存限制 : 128 MB
先说明一下什么是中缀式:
如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
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; }
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; }