首页 > 代码库 > 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
题目链接: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;//记录最后栈内还剩有的数字有多少个,有多个则ERROR int 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()); else printf("ERROR\n"); } return 0; }
3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。