前言必读!http://blog.csdn.net/hnust_v/article/details/51747743
问题 H: 简单表达式求值
题目描述
给出简单的表达式,运算符只有加减乘除,运算数是非负整数,计算其值。
输入
输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当EOF时输入结束.
输出
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入
1 3 - 8 / 4
样例输出
1.00 1.00
提示
#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
char A[20000];
double Cal(int len)
{
stack<double> value; stack<char> oper;
double a=0;
for(int i=1;i<=len;i++)
{
// if(!value.empty()) cout<<value.top()<<endl;
if(A[i]<='9'&&A[i]>='0') a=a*10+(double)(A[i]-'0');
else if(A[i]==' ')
{
value.push(a);
// printf("a==%lf\n",a);
a=0;
continue;
}
else
{
if(A[i]=='-'||A[i]=='+')
{
if(!oper.empty())
{
double rig=value.top();value.pop();
while(!oper.empty())
{
double lef=value.top();value.pop();
char OPE=oper.top();oper.pop();
if(OPE=='+') rig=(lef+rig);
if(OPE=='-') rig=(lef-rig);
if(OPE=='*') rig=(lef*rig);
if(OPE=='/') rig=(lef/rig);
}
value.push(rig);oper.push(A[i]);
}
else oper.push(A[i]);
}
else if(!oper.empty()&&(oper.top()=='*'||oper.top()=='/'))
{
double rig=value.top();value.pop();
double lef=value.top();value.pop();
char OPE=oper.top();oper.pop();
if(OPE=='*') rig=(lef*rig);
if(OPE=='/') rig=(lef/rig);
value.push(rig);
oper.push(A[i]);
}
else oper.push(A[i]);
i++;
}
if(i==len)
{
// printf("a==%lf\n",a);
while(!value.empty())
{
// printf("i==%d a==%lf\n",i,a);
double lef=value.top();value.pop();
// printf("lef==%lf\n",lef);
char OPE=oper.top();oper.pop();
if(OPE=='+') a=(lef+a);
if(OPE=='-') a=(lef-a);
if(OPE=='*') a=(lef*a);
if(OPE=='/') a=(lef/a);
}
return a;
}
}
return a;
}
int main()
{
//freopen("F:\\test.txt","r",stdin);
while(gets(A+1)!=NULL)
{ printf("%.2lf\n",Cal(strlen(A+1))); }
}