3-07. 求前缀表达式的值(25)
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式说明:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式说明:
输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。
样例输入与输出:
序号 | 输入 | 输出 |
1 | + + 2 * 3 - 7 4 / 8 4 | 13.0 |
2 | / -25 + * - 2 3 4 / 8 4 | 12.5 |
3 | / 5 + * - 2 3 4 / 8 2 | ERROR |
4 | +10.23 | 10.2 |
#include<stdio.h>
#include<stack>
#include<iostream>
#include<string>
using namespace std;
float oper(float f1,float f2, char op)
{
if(op=='+')
return f1+f2;
else if(op=='-')
return f1-f2;
else if(op=='*')
return f1*f2*1.0;
else if(op=='/')
return f1*1.0/f2;
}
int main()
{
stack<float> s;
string prefixExp;
getline(cin,prefixExp);
int strLen=prefixExp.length();
int temp,i,j;
int t1,t2;
for(i=strLen-1;i>=0;i--)
{
string digitStr="";
if(prefixExp[i]=='+' || prefixExp[i]=='-' || prefixExp[i]=='*' || prefixExp[i]=='/') //运算符
{
t1=s.top();
s.pop();
t2=s.top();
s.pop();
if(t2==0 && prefixExp[i]=='/')
{
printf("ERROR\n");
return 0;
}
s.push(oper(t1,t2,prefixExp[i]));
// printf("%f\n",s.top());
i--;//下一位肯定是空格
}
else //运算数
{
while(i>=0 && prefixExp[i]!=' ') //不要漏掉i>=0条件
{
digitStr=prefixExp[i]+digitStr;
i--;
}
//printf("atof:%f\n",atof(digitStr.c_str()));
s.push(atof(digitStr.c_str()));
}
}
if(s.size()==1)
printf("%0.1f\n",s.top());
else
printf("ERROR\n");
return 0;
}