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
1. //递归法 2. #include<bits/stdc++.h> 3. using namespace std; 4. char s[1001]; 5. double v=0; 6. double bol() 7. { 8. scanf("%s",s); 9. switch(s[0]){ 10. case'+':return bol()+bol();break; 11. case'-':return bol()-bol();break; 12. case'*':return bol()*bol();break; 13. case'/':return bol()/bol();break; 14. default:v=atof(s);//atof(s)将字符串s转换为double的浮点数 15. } 16. return v; 17. } 18. int main() 19. { 20. printf("%.6lf",bol()); 21. return 0; 22. }
1. //手工解析模拟 逆推 栈 2. #include<bits/stdc++.h> 3. using namespace std; 4. char s[1001]; 5. double v=0; 6. void get_value(stack<double> &s,double &a ,double &b) 7. { 8. a=s.top(); 9. s.pop(); 10. b=s.top(); 11. s.pop(); 12. } 13. int main() 14. { 15. int k=0; 16. string exp[100]; 17. stack<double> st; 18. double a,b; 19. cin.getline(s,1000,'\n'); 20. for(int i=strlen(s)-1;i>=0;i--) { 21. if(s[i]==' ') k++; 22. else exp[k].insert(exp[k].begin(),s[i]); 23. } 24. for(int i=0;i<=k;i++){ 25. if(exp[i]=="+"){ 26. get_value(st,a,b); 27. st.push(a+b); 28. } 29. else if (exp[i]=="-"){ 30. get_value(st,a,b); 31. st.push(a-b); 32. 33. } 34. else if (exp[i]=="*"){ 35. get_value(st,a,b); 36. st.push(a*b); 37. } 38. else if (exp[i]=="/"){ 39. get_value(st,a,b); 40. st.push(a/b); 41. } 42. else 43. st.push(atof(exp[i].c_str())); 44. } 45. printf("%f",st.top()); 46. return 0; 47. }