🏆今日学习目标:
🍀例题讲解1696:波兰表达式
✅创作者:贤鱼
⏰预计时间:25分钟
🎉个人主页:贤鱼的个人主页
🔥专栏系列:c++
🍁贤鱼的个人社区,欢迎你的加入 贤鱼摆烂团
61696:波兰表达式
- 题目
- 思路
- AC代码
题目
总时间限制: 1000ms 内存限制: 65536kB
-
描述
波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式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中。
此题可使用函数递归调用的方法求解。
思路
递归思路不讲了很简单一看就会
栈的思路就是结构体储存记录符号和数字,遇到数字入栈,遇到符号计算,由于前缀表达式,直接顺序记录最后倒序处理就好了
AC代码
#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;
char m[100000];
double js(){
scanf("%s",m+1);
switch(m[1]){
case '+':return js()+js();break;
case '-':return js()-js();break;
case '*':return js()*js();break;
case '/':return js()/js();break;
default:return atof(m+1);
}
}
int main(){
printf("%lf",js());
}
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<stack>
#include<bits/stdc++.h>
using namespace std;
stack<double>nm;
char s[10005];
struct node{
char f;
double m;
}a[10005];
double cl(double xx,double yy,char t){
switch(t){
case'+':return xx+yy;
case'-':return yy-xx;
case'*':return xx*yy;
default:return yy/xx;
}
}
int cnt=0;
double js(){
for(int i=cnt;i>=1;i--){
if(a[i].f=='\0'){
nm.push(a[i].m);
}else{
double x=nm.top();
nm.pop();
double y=nm.top();
nm.pop();
nm.push(cl(y,x,a[i].f));
}
}
return nm.top();
}
int main(){
while(scanf("%s",s)!=EOF){
if((s[0]>='0'&&s[0]<='9')||(s[1]>='0'&&s[1]<='9')){
a[++cnt].m=atof(s);
a[cnt].f='\0';
}else{
a[++cnt].f=(s[0]);
a[cnt].m=0;
}
}
printf("%lf\n",js());
}