5-3 求前缀表达式的值 (25分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4
的前缀表达式是:+
+ 2 * 3 - 7 4 / 8 4
。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+
、-
、*
、\
以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR
。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
char s[50];
stack <double> ss;
int is_op(char c){
if(c == '+' || c == '-' || c == '*' || c == '/')
return 1;
return 0;
}
int main(){
while(gets(s)){
while(!ss.empty())
ss.pop();
int len = strlen(s);
int cc = 1;
double tsum = 0;
int flag = 0;//标记是否出现0为除数的情况
for(int i = len - 1; i >= 0; i--){
if(s[i] >= '0' && s[i] <= '9'){
tsum +=(s[i] - '0') * cc;
cc*= 10;
}
else if(s[i] == '.'){//小数
tsum = tsum/(cc * 1.0);
cc = 1;
}
else if((s[i] == '+' || s[i] == '-') && tsum != 0){
if(s[i] == '+'){
ss.push(tsum);
i--;
continue;
}
else {
tsum = -tsum;
ss.push(tsum);
i--;
continue;
}
}
else if(s[i] == ' '){
ss.push(tsum);
tsum = 0;
cc = 1;
continue;
}
else if(is_op(s[i])){//是操作符
double a = ss.top();
ss.pop();
double b = ss.top();
ss.pop();
double tt = 0;
if(s[i] == '+') tt = a + b;
if(s[i] == '-') tt = a - b;
if(s[i] == '*') tt = a * b;
if(s[i] == '/') {
if(b == 0){
flag = 1;
break;
}
tt = a / b;
}
ss.push(tt);
i--;
}
}
if(flag != 1)
printf("%.1lf\n", ss.top());
else
printf("ERROR\n");
}
return 0;
}