1198:逆波兰表达式 <这里应该是波兰表达式(前缀表达式),而逆波兰指的是后缀表达式>
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式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
【来源】
No
//递归法
#include<bits/stdc++.h>
using namespace std;
char s[1001];
double v=0;
double bol()
{
scanf("%s",s);
switch(s[0]){
case'+':return bol()+bol();break;
case'-':return bol()-bol();break;
case'*':return bol()*bol();break;
case'/':return bol()/bol();break;
default:v=atof(s);//atof(s)将字符串s转换为double的浮点数
}
return v;
}
int main()
{
printf("%.6lf",bol());
return 0;
}
//手工解析模拟 逆推 栈
#include<bits/stdc++.h>
using namespace std;
char s[1001];
double v=0;
void get_value(stack<double> &s,double &a ,double &b)
{
a=s.top();
s.pop();
b=s.top();
s.pop();
}
int main()
{
int k=0;
string exp[100];
stack<double> st;
double a,b;
cin.getline(s,1000,'\n');
for(int i=strlen(s)-1;i>=0;i--) {
if(s[i]==' ') k++;
else exp[k].insert(exp[k].begin(),s[i]);
}
for(int i=0;i<=k;i++){
if(exp[i]=="+"){
get_value(st,a,b);
st.push(a+b);
}
else if (exp[i]=="-"){
get_value(st,a,b);
st.push(a-b);
}
else if (exp[i]=="*"){
get_value(st,a,b);
st.push(a*b);
}
else if (exp[i]=="/"){
get_value(st,a,b);
st.push(a/b);
}
else
st.push(atof(exp[i].c_str()));
}
printf("%f",st.top());
return 0;
}