算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式: 输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式: 输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
输入样例:
+ + 2 * 3 - 7 4 / 8 4输出样例:
13.0思路 之前做过的中缀表达式转换成后缀表达式线性结构实验题目集2020——1-3 表达式转换 (25分) emmmmm把前缀倒过来看就是后缀,我以为前缀照着做做就能写出来的结果依然不行,唉,太难了 下面是百度的代码 函数atof()是C 语言标准库中的一个字符串处理函数,功能是把字符串转换成浮点数,所使用的头文件为<stdlib.h>。语法格式为:double atof(const char *nptr)。 string ss; double x=atof(ss.c_str()); 代码
#include <bits/stdc++.h> using namespace std; int main() { double a,b; int flag=0; string s[100];//规定一百个字符串数组 int n=0; while(cin>>s[n++]);//输入中空格是截止符 n--; stack<double> num; for(int i=n-1;i>=0;i--){ /*如果是运算符*/ if((s[i][0]=='+'||s[i][0]=='-'||s[i][0]=='*'||s[i][0]=='/')&&s[i].length()==1){ if(num.size()<2){ flag=1;break;} a=num.top(); num.pop(); b=num.top(); num.pop(); if(s[i][0]=='*') num.push(a*b); else if(s[i][0]=='/') { if(b==0) {flag=1;break;} num.push(a/b); } else if(s[i][0]=='+') num.push(a+b); else if(s[i][0]=='-') num.push(a-b); } else{/*为数*/ double x=atof(s[i].c_str()); num.push(x); } } if(num.size()!=1) flag=1; if(flag) cout<<"ERROR"; else printf("%.1f",num.top()); return 0; }