本文主要是介绍noi.openjudge 1696:逆波兰表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://noi.openjudge.cn/ch0303/1696/
描述
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出
输出为一行,表达式的值。
可直接用printf("%f\n", v)输出表达式的值v。
样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000
提示
可使用atof(str)把字符串转换为一个double类型的浮点数。atof定义在math.h中。
此题可使用函数递归调用的方法求解。
代码
#include<algorithm>
#include<iostream>
#include<limits.h>
#include<string.h>
#include<sstream>
#include<stdio.h>
#include<math.h>
#include<stack>
using namespace std;char k[1001];
char s[1001],tmp[1001];
double num[1001];
int l=-1,sum,top;
double ans;
stack <double> a;int main()
{gets(s); for(int i=1;i<=1000;i++)num[i]=INT_MIN;//num数组赋极值 for(int i=0;i<=strlen(s);i++)if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/')//运算符 tmp[++sum]=s[i];else if(isdigit(s[i]) || s[i]=='.')//数字或者小数点 k[++l]=s[i];else if(s[i-1]>='0'&&s[i-1]<='9') //只有数字之后的空格才需要把字符串转换成数字 {num[++sum]=atof(k);memset(k,0,sizeof(k));l=-1;//l从-1开始,因为上面k[++l]=s[i],数组k从0开始赋值 }for(int i=sum; i>0; i--){if(num[i]!=INT_MIN)a.push(num[i]);//不是数字 else//运算符,弹出栈顶两个数字运算 {double x=a.top();a.pop();double y=a.top();a.pop();switch(tmp[i]){case '+':ans=x+y;break;case '-':ans=x-y;break;case '*':ans=x*y;break;case '/':ans=x/y;break;}a.push(ans);//运算完结果入栈 }}printf("%f\n",a.top());return 0;
}
这篇关于noi.openjudge 1696:逆波兰表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!