题目
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
题解
模拟乘除加减的简单问题,用stack记录乘除加减符号,在一个个带入,很水的题目,注意double精度问题,但是我还是debug了半天,主要是输出问题
cout << fixed << setprecision(2) << si.top() << endl;//WA
printf("%.2lf\n",si.top());//AC
这两个东西是哪里有区别的???哭。。。太菜了我
代码
呃呃呃,这个代码不重要的,都没精简过。。。
string s;
stack<double>si;
stack<char>sc;
int main() {
speed;
while (1) {
getline(cin, s);
while (!si.empty())si.pop();
while (!sc.empty())sc.pop();
if (s == "0")break;
for (int i = 0; i < s.length(); i++) {
double a = 0; int j;
if (s[i] >= '0' && s[i] <= '9') {
for (j = i; j < s.length(); j++) {
if (s[j] >= '0' && s[j] <= '9') {
a = a * 10 + s[j] - '0';
}
else break;
}
si.push(a);
i = j;
}
else if (s[i] != ' ') {
if (s[i] == '*') {
double b = si.top();
si.pop();
for (j = i + 2; j < s.length(); j++) {
if (s[j] >= '0' && s[j] <= '9') {
a = a * 10 + s[j] - '0';
}
else break;
}
si.push(a *1.000 * b );
i = j;
}
else if (s[i] == '/') {
double b = si.top();
si.pop();
for (j = i + 2; j < s.length(); j++) {
if (s[j] >= '0' && s[j] <= '9') {
a = a * 10 + s[j] - '0';
}
else break;
}
si.push(b*1.000 / a);
i = j;
}
else if (s[i] == '-') {
for (j = i + 2; j < s.length(); j++) {
if (s[j] >= '0' && s[j] <= '9') {
a = a * 10 + s[j] - '0';
}
else break;
}
si.push(-a);
i = j;
sc.push('+');
}
else sc.push(s[i]);
}
}
while (!sc.empty()) {
char c = sc.top();
sc.pop();
double first, second;
first = si.top();
si.pop();
second = si.top();
si.pop();
si.push(first + second);
}
printf("%.2lf\n",si.top());
si.pop();
}
return 0;
}