题目描述:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
思路:
题不难,就是模拟+栈模型应用,虽然自己做了一下午。。。
读入一行之后可以跳过空格来简化过程。flag存储这个数字的上一个字符,初始为+;如果上一个字符是-,则存入相反数;如果是*,取出上一个数字和这个数字相乘再存入;如果是/,取出上一个数字和这个数字相除再存入。
再就需要注意i==len-1的时候,到最后但下一个没有加减乘除,来个特殊处理就好。
代码:
using namespace std;
double a[205];
int top, flag;
string str;
int main()
{
while (getline(cin, str)){
memset(a, 0, sizeof(a));
int len=str.length();
top=0, flag=1;
if (str[0]=='0' && len==1)
break;
double ans=0, sum=0;
for (int i=0; i<len; i++){
if (str[i]==' ') continue;
if (str[i]>='0' && str[i]<='9')
ans=ans*10+str[i]-'0';
else{
if (flag==1){a[++top]=ans; ans=0;
}
if (flag==2){a[++top]=-ans; ans=0;
}
if (flag==3){double tmp=a[top];
a[top]=tmp*ans;
ans=0;
}
if (flag==4){double tmp=a[top];
a[top]=tmp/ans;
ans=0;
}
if (str[i]=='+') flag=1;
if (str[i]=='-') flag=2;
if (str[i]=='*') flag=3;
if (str[i]=='/') flag=4;
}
if (i==len-1){
if (flag==1){a[++top]=ans; ans=0;
}
if (flag==2){a[++top]=-ans; ans=0;
}
if (flag==3){double tmp=a[top];
a[top]=tmp*ans;
ans=0;
}
if (flag==4){double tmp=a[top];
a[top]=tmp/ans;
ans=0;
}
}
}
for (int i=1; i<=top; i++)
sum+=a[i];
printf("%.2f\n", sum);
}
return 0;
}