Description:

读入一个只包含 +,-,*,/的非负整数计算表达式,计算该表达式的值。

Input:

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output:

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input:

1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output:

3.00
13.36

题目链接

这道题最开始想的是用处理字符串,但是处理起来会非常麻烦,用栈会好些很多,首先读入第一个数压入栈顶,之后每次读入一个符号和一个数字,如果是"+“号则将数字压入栈顶,如果是”-“号则将数字的相反数压入栈顶,如果是”*“号则先将数字与栈顶数字相乘再将栈顶元素取出,向栈顶压入计算所得数字,如果是”/"号则先将栈顶数字与数字相除再将栈顶元素取出,向栈顶压入计算所得数字。所有数据读入完成之后栈内所有元素之和便是结果。

AC代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cctype>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>

using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    double ans,a,b,n;
    char c;
    while (1) {
        stack<double> S;
        ans = 0;
        cin >> n;
        c = getchar();
        if (n == 0 && c == '\n') {
            break;
        }
        S.push(n);
        while (cin >> c >> n) {
            if (c == '+') {
                S.push(n);
            }
            else if (c == '-') {
                S.push(-n);
            }
            else if (c == '*') {
                n = S.top() * n;
                S.pop();
                S.push(n);
            }
            else if (c == '/') {
                n = S.top() / n;
                S.pop();
                S.push(n);
            }
            if (getchar() == '\n') {
                break;
            }
        }
        while (!S.empty()) {
            ans += S.top();
            S.pop();
        }
        cout << setiosflags(ios::fixed) << setprecision(2) << ans << endl;
    }
    return 0;
}