前缀表达式求值

来源:互联网 发布:mysql忘记密码 编辑:程序博客网 时间:2024/05/29 03:07

序号输入输出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

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式说明:

输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式说明:

输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。

样例输入与输出:

前缀,中缀,后缀表达式相关问题请见点击打开链接

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <stack>using namespace std;int main() {char s[50];stack <double> st;gets(s);double num;int i, cnt;for(i = strlen(s) - 1; i >= 0; i--) {if(s[i] >= '0' && s[i] <= '9') {num = s[i] - '0';cnt = 10;for(i--; i >= 0; i--) {//printf("%f\n", num);if((s[i] >= '0' && s[i] <= '9') || (s[i] == '.')) {if(s[i] >= '0' && s[i] <= '9') {num += (s[i] - '0') * cnt;cnt = cnt * 10;}else {num = num / cnt;cnt = 1;}}else if(s[i] == '-') {num = -num;}else {break;}}st.push(num);}else if(s[i] == ' ') {continue;}else {double a, b, sum;a = st.top();st.pop();b = st.top();st.pop();if(s[i] == '+') {sum = a + b;}else if(s[i] == '-') {sum = a - b;}else if(s[i] == '*') {sum = a * b;}else {if(b == 0) {printf("ERROR");exit(0);}sum = a / b;}st.push(sum);}}double re = st.top();printf("%.1f", re);return 0;}


0 0
原创粉丝点击