熟悉STL会好做一点
-
描述
-
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)-
输入
-
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0 -
输出
-
每组都输出该组运算式的运算结果,输出结果保留两位小数。
-
样例输入
-
2 1.000+2/4= ((1+2)*5+1)/4=
-
样例输出
-
1.50 4.00
-
#include <iostream>
#include <cstring>
#include <string>
#include <stack>
#include <iomanip>
using namespace std;
int prio(char x)
{
switch(x)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
int main()
{
int n,i;
double result,factor;
string s1,s2;
stack<char> s;
stack<double> d;
cin>>n;
while(n--)
{
cin>>s1;
//将s1转为逆波兰式s2
i=0;
s2="";
s.push('#');
while(i<s1.length()-1)
{
if ( '('==s1[i] )
{
s.push(s1[i++]);
}
else if ( ')'==s1[i] )
{
while( s.top()!='(' )
{
s2+=s.top();
s2+=' ';
s.pop();
}
s.pop();
i++;
}
else if('+'==s1[i] || '-'==s1[i] || '*'==s1[i] || '/'==s1[i])
{
while(prio(s.top())>=prio(s1[i]))
{
s2+=s.top();
s2+=' ';
s.pop();
}
s.push(s1[i]);
i++;
}
else
{
while(s1[i]>='0'&&s1[i]<='9' || '.'==s1[i])
s2+=s1[i++];
s2+=' ';
}
}
while(s.top()!='#')
{
s2+=s.top();
s2+=' ';
s.pop();
}
//计算s2的值
/* cout<<s2<<endl;*/
i=0;
while(i<s2.length())
{
switch(s2[i])
{
case '+':
result=d.top();
d.pop();
result+=d.top();
d.pop();
i++;
break;
case '-':
result=d.top();
d.pop();
result=d.top()-result;
d.pop();
i++;
break;
case '*':
result=d.top();
d.pop();
result*=d.top();
d.pop();
i++;
break;
case '/':
result=d.top();
d.pop();
result=d.top()/result;
d.pop();
i++;
break;
default:
result=0;
factor=10.00;
while(s2[i]>='0'&&s2[i]<='9')
{
result=result*10+s2[i]-'0';
i++;
}
if('.'==s2[i++])
{
while(s2[i]>='0'&&s2[i]<='9')
{
result=result+(s2[i]-'0')/factor;
factor*=10;
i++;
}
}
}
d.push(result);
while(' '==s2[i])
i++;
}
cout<<fixed<<setprecision(2)<<d.top()<<endl;
}
return 0;
}