题目链接:http://pat.zju.edu.cn/contests/ds/3-07
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,比如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 <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
char s[47];
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;//标记是否出现零作为除数的情况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;else if(s[i] == '-')tt = a-b;else if(s[i] == '*')tt = a*b;else if(s[i] == '/'){if(b == 0){flag = 1;break;}tt = a/b;}ss.push(tt);i--;//跳过下一个空格}}/*int k = 0;//记录最后栈内还剩有的数字有多少个,有多个则ERRORint lenn = ss.size();double tt;for(int i = 0; i < lenn; i++){tt = ss.top();ss.pop();if(!is_op(tt)){k++;}}if(flag != 1)printf("%.1lf\n",tt);*/if(flag != 1)printf("%.1lf\n",ss.top());elseprintf("ERROR\n");}return 0;
}