题目描述
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0
样例输出
12178.21
#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
using namespace std;
int main()
{
char s[250];
while(gets(s)&&strcmp(s,"0"))
{
int len=strlen(s);
int i,j;
stack<double>num;//存储整数
stack<char>op;//存储运算符
for(i=0;i<len;i++)//遍历字符串开始处理
{
if(s[i]==' ')//空格直接跳过
continue;
else if(s[i]=='*'||s[i]=='/')//乘法除法运算符,运算完后将结果入栈
{
double x=num.top();//拿出数字栈中的栈顶元素
num.pop();
double y=0;
for(j=i+2;j<len;j++)//提取出字符串中的整数, i+1是空格,i+2是数字
{
if(s[j]!=' ')
y=y*10+s[j]-'0';
else
break;
}
if(s[i]=='*')
num.push(x*y);
else
num.push(x/y);
i=j;//更新遍历字符串的位置 ,下一个字符
}
else if(s[i]=='+'||s[i]=='-')//加法减法运算符,先进栈
op.push(s[i]);
else//提取数字进数字栈
{
double y=0;
for(j=i;j<len;j++)
{
if(s[j]!=' ')
y=y*10+s[j]-'0';
else
break;
}
i=j;
num.push(y);
}
}
//因为进栈之后出栈顺序与运算顺序相反,所以要将栈内元素反转
stack<double>num2;
stack<char>op2;
while(!num.empty())
{
double temp=num.top();
num2.push(temp);
num.pop();
}
while(!op.empty())
{
char temp=op.top();
op2.push(temp);
op.pop();
}
while(!num2.empty()&&!op2.empty())
{
double x=num2.top();//拿出第一个整数
num2.pop();
double y=num2.top();//拿出第二个整数
num2.pop();
char optemp=op2.top();
op2.pop();
if(optemp=='+')
num2.push(x+y);
else
num2.push(x-y);
}
printf("%.2lf\n",num2.top());
num2.pop();
}
return 0;
}