1198:逆波兰表达式
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 22013 通过数: 13681
【题目描述】
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
【输入】
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
【输出】
输出为一行,表达式的值。
可直接用printf("%f\n", v)输出表达式的值v。
【输入样例】
- 11.0 12.0 + 24.0 35.0
【输出样例】
- 11.0 12.0 + 24.0 35.0
1357.000000
可以过,但是我的代码中stringtodouble函数为什么只能从string中剥出1位小数
stringtodouble函数定义:
double stringtodouble(string x)
{
int len=x.size();
double t=0.00,fushu=1.00;
if(x[0]=='-')
{
fushu=-1.00;
for(int i=0;i<len-1;i++)
{
x[i]=x[i+1];
}
len--;
}
bool xiaoshu=false;
double xiaoshuwei=10.00;
for(int i=0;i<len;i++)
{
if(x[i]=='.')
{
xiaoshu=true;
continue;
}
if(!xiaoshu)
{
t=t*10.00+x[i]-'0';+x[i]-'0';
}
else
{
t+=(x[i]-'0')/xiaoshuwei;
// cout<<t<<endl;
xiaoshuwei*=10;
}
}
return t*fushu;
}
代码:
#include<bits/stdc++.h>
using namespace std;
double stringtodouble(string x)
{
int len=x.size();
double t=0.00,fushu=1.00;
if(x[0]=='-')
{
fushu=-1.00;
for(int i=0;i<len-1;i++)
{
x[i]=x[i+1];
}
len--;
}
bool xiaoshu=false;
double xiaoshuwei=10.00;
for(int i=0;i<len;i++)
{
if(x[i]=='.')
{
xiaoshu=true;
continue;
}
if(!xiaoshu)
{
t=t*10.00+x[i]-'0';+x[i]-'0';
}
else
{
t+=(x[i]-'0')/xiaoshuwei;
// cout<<t<<endl;
xiaoshuwei*=10;
}
}
return t*fushu;
}
double hs()
{
string a;
cin>>a;
if(a=="+")
{
return hs()+hs();
}
if(a=="-")
{
return hs()-hs();
}
if(a=="*")
{
return hs()*hs();
}
if(a=="/")
{
return hs()/hs();
}
return stringtodouble(a);
}
int main()
{
cout<<fixed<<setprecision(6)<<hs();
}