描述
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 <iomanip>
#include <string>
#include <stack>
using namespace std;
int cmp(char c)
{
if (c == '*' || c == '/')
return 2;
else if (c == '+' || c == '-')
return 1;
else
return 0;
}
void change(string &s1, string &s2)
{
stack<char> s;
s.push('#');
int cur = 0;
while (cur < s1.length() - 1)
{
if (s1[cur] == '(')
s.push(s1[cur++]);
else if (s1[cur] == ')')
{
while (s.top() != '(')
{
s2 += s.top();
s2 += ' ';
s.pop();
}
s.pop();
cur++;
}
else if (s1[cur] == '+' || s1[cur] == '-' || s1[cur] == '*' || s1[cur] == '/')
{
while (cmp(s.top()) >= cmp(s1[cur]))
{
s2 += s.top();
s2 += ' ';
s.pop();
}
s.push(s1[cur]);
cur++;
}
else
{
while ((s1[cur] >= '0' && s1[cur] <= '9') || s1[cur] == '.')
{
s2 += s1[cur++];
}
s2 += ' ';
}
}
while (s.top() != '#')
{
s2 += s.top();
s2 += ' ';
s.pop();
}
}
double value(string s2)
{
stack<double> s;
double x, y;
int cur = 0;
while (cur < s2.length())
{
if (s2[cur] == ' ')
{
cur++;
continue;
}
switch (s2[cur])
{
case '+' : x = s.top(); s.pop(); x += s.top(); s.pop(); cur++; break;
case '-' : x = s.top(); s.pop(); x = s.top()-x; s.pop(); cur++; break;
case '*' : x = s.top(); s.pop(); x *= s.top(); s.pop(); cur++; break;
case '/' : x = s.top(); s.pop(); x = s.top()/x; s.pop(); cur++; break;
default:
{
x = 0;
while (s2[cur] >= '0' && s2[cur] <= '9')
{
x = x*10 + s2[cur]-'0';
cur++;
}
if (s2[cur] == '.')
{
double k = 10.0;
y = 0;
cur++;
while (s2[cur] >= '0' && s2[cur] <= '9')
{
y += ((s2[cur]-'0')/k);
cur++;
k *= 10;
}
x += y;
}
}
}
s.push(x);
}
return s.top();
}
int main()
{
string s1, s2;
int T;
cin >> T;
while (T--)
{
cin >> s1;
s2 = " ";
change(s1, s2);
cout << fixed << setprecision(2) << value(s2) << endl;
}
return 0;
}