题目描述
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入描述:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出描述:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
示例1
输出
复制3.00
13.36
//题目中的例子是有空格的
#include<iostream>
#include<stack>
#include<string>
using namespace std;
string s;
stack<int>op;//存储运算符的编号.0:= 1:+ 2:- 3:* 4:/
stack<double>in;
int mat[][5]
{
1,0,0,0,0,
1,0,0,0,0,
1,0,0,0,0,
1,1,1,0,0,
1,1,1,0,0,
};
void get(bool &retop,int &retnum,int &i)
{
if(s[i]>='0'&&s[i]<='9')
{
retop=false;
double temp=s[i]-'0';
for(i++;s[i]>='0'&&s[i]<='9';i++)
{
temp=temp*10+s[i]-'0';
}
retnum=temp;
i++;
}
else
{
retop=true;
if(s[i]=='#')
retnum=0;
else if(s[i]=='+')
retnum=1;
else if(s[i]=='-')
retnum=2;
else if(s[i]=='*')
retnum=3;
else if(s[i]=='/')
retnum=4;
i+=2;
}
}
int main()
{
while(getline(cin,s))
{
bool retop;//返回当前字符是否是运算符,是true 否false;
int retnum;//如果是运算符返回运算符的编号,否则返回运算数
int i;//遍历字符串的下标
s="# "+s+" #";//在添加人为的符号的时候,切记空格
while(!op.empty())op.pop();
while(!in.empty())in.pop();
while(true)
{
get(retop,retnum,i);
if(retop==false)
{
in.push((double)retnum);
}//是数字
else
{
double result;
if(op.empty()||mat[retnum][op.top()]==1)
{
op.push(retnum);
}
else
{
while(mat[retnum][op.top()]==0)
{
double a=in.top();
in.pop();
double b=in.top();
in.pop();
int c=op.top();
op.pop();
if(c==1)
result=a+b;
if(c==2)
result=b-a;
if(c==3)
result=a*b;
if(c==4)
result=b/a;
in.push(result);
}
op.push(retnum);
}
}
if(op.size()==2&&op.top()==0)
break;
}
printf("%.2lf\n",in.top());
}
return 0;
}