2694:逆波兰表达式
-
总时间限制:
- 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的时候没考虑使用递归,利用栈的先进后出加上判断,即可达到计算目的,可惜第一次提交忘了考虑浮点数为负数的情况,第二次提交忘了讨论(3+1)*(4-2)/(7/-2)这种情况,因为4-2运算后会继续和站里面的3+1的运算结果运算,而后再次将结果入栈,因此我将if循环改成了while循环,Ac。
第二种解法考虑使用递归,此时需要理解,代码简洁。
#include<stdio.h>
#include<stack>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 100
#define M 10010
typedef struct Node{
int tag;
double a;
char b;
}node;
double f2(double a,double b,char ch)
{
if(ch=='+')return a+b;
else if(ch=='-')return b-a;
else if(ch=='*')return b*a;
else return b/a;
}
int f(char e)
{
if(e=='+'||e=='-'||e=='*'||e=='/')
return 1;
return 0;
}
int main()
{
char a[M];
while(gets(a)){
stack<node> q;
int lenc=strlen(a),i,j;
for(i=0;i<lenc;i++){
node tt;
if(f(a[i])&&a[i+1]==' '){
tt.tag=0;
tt.b=a[i];
q.push(tt);
}
else if(a[i]==' ')
continue;
else{ char b[N];
int cnt=0;
for(j=i;j<lenc&&a[j]!=' ';j++){
b[cnt++]=a[j];
}
i=j-1;
b[cnt]='\0';
double rr=atof(b);
tt.tag=1;
tt.a=rr;
q.push(tt);
}
while(q.size()>=3)
{node t1,t2,t3;
t1=q.top();
q.pop();
t2=q.top();
q.pop();
t3=q.top();
q.pop();
if(t1.tag==1&&t2.tag==1&&t3.tag==0){
double ttt=f2(t1.a,t2.a,t3.b);
node t4;
t4.tag=1;
t4.a=ttt;
q.push(t4);
}
else{
q.push(t3);
q.push(t2);
q.push(t1);
break;
}
}
}
node t=q.top();
printf("%lf\n",t.a);
}
}
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
int f(char a)
{
if(a>='0'&&a<='9')
return 1;
return 0;
}
double exp(){
char a[10];
scanf("%s",a);
if(strlen(a)==1&&!f(a[0])){
if(a[0]=='+')return exp()+exp();
else if(a[0]=='-')return exp()-exp();
else if(a[0]=='*')return exp()*exp();
else if(a[0]=='/')return exp()/exp();
}
else
return atof(a);
}
int main()
{
double ans;
ans=exp();
printf("%f\n",ans);
}