简单计算器
题目描述
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出
3.00
13.36
样例代码
#include <bits/stdc++.h>
using namespace std;
double tmp, a, b;
char str[205], ch;
stack<double> num;
stack<char> cha;
bool check(char s)
{
if (s == '+' || s == '-' || s == '*' || s == '/') return true;
else return false;
}
bool check2(char s1, char s2)
{
if (s1 == '*' || s1 == '/') return true;
if (s2 == '+' || s2 == '-') return true;
return false;
}
void calculate()
{
int len = strlen(str);
for (int i = 0; i < len; i++)
{
if (str[i] == ' ') continue;
if (str[i] >= '0' && str[i] <= '9')
{
tmp = 0;
while (str[i] >= '0' && str[i] <= '9')
{
tmp *= 10;
tmp += str[i]-'0';
i++;
}
num.push(tmp);
}
if (check(str[i]))
{
if (cha.empty()) cha.push(str[i]);
else
{
ch = cha.top();
while (check2(ch, str[i]))
{
a = num.top();
num.pop();
b = num.top();
num.pop();
cha.pop();
switch(ch)
{
case '+':num.push(a+b);break;
case '-':num.push(b-a);break;
case '*':num.push(a*b);break;
case '/':num.push(b/a);break;
}
if (cha.empty()) break;
else ch = cha.top();
}
cha.push(str[i]);
}
}
}
while (!cha.empty())
{
a = num.top();
num.pop();
b = num.top();
num.pop();
ch = cha.top();
cha.pop();
switch(ch)
{
case '+':num.push(a+b);break;
case '-':num.push(b-a);break;
case '*':num.push(a*b);break;
case '/':num.push(b/a);break;
}
}
printf("%.2f\n", num.top());
num.pop();
}
int main(int argc, char const *argv[])
{
while (gets(str) != NULL)
{
if (!strcmp(str, "0")) break;
calculate();
}
return 0;
}