另一段神秘の代码

#include <bits/stdc++.h>

using namespace std;
struct Expression {
    Expression *left = nullptr, *right = nullptr;
    char op;
    double val;
};

double calculate(Expression *root) {
    if (root->op == 0) return root->val;
    if (root->op == '^') return pow(calculate(root->left), calculate(root->right));
    if (root->op == '*') return calculate(root->left) * calculate(root->right);
    if (root->op == '/') return calculate(root->left) / calculate(root->right);
    if (root->op == '+') return calculate(root->left) + calculate(root->right);
    if (root->op == '-') return calculate(root->left) - calculate(root->right);
    return 0.0;
}

string s;
int brackets[100000];

vector<Expression *> token;

vector<Expression *> deal(vector<Expression *> v, char op, char op2) {
    vector<Expression *> v1;
    for (int i = 0; i < v.size(); ++i) {
        if ((v[i]->op == op || v[i]->op == op2) && !v[i]->left && !v[i]->right) {
            v[i]->left = v1.back();
            v1.pop_back();
            v1.push_back(v[i]);
            v1.back()->right = v[i + 1];
            i++;
        } else {
            v1.push_back(v[i]);
        }
    }
    return v1;
}

Expression *create(int l, int r) {
    vector<Expression *> v;
    // 处理括号
    for (int i = l; i <= r; ++i) {
        if (token[i]->op == '(') {
            v.push_back(create(i + 1, brackets[i] - 1));
            i = brackets[i];
        } else {
            v.push_back(token[i]);
        }
    }
    return deal(
        deal(
        deal(v,
         '^', '^'
      ), '*', '/'
      ), '+', '-'
    ).front();
}

double eval(string s) {
    s += "(";
    double cur = 0;
    double ccur = 0.1;
    int neg = 1;
    int k = 0;
    for (int i = 0; i < s.size(); ++i) {
        if (isdigit(s[i])) {
            if (k == 0 || k == 1) {
                cur = cur * 10 + s[i] - '0';
                k = 1;
            } else {
                cur += ccur * (s[i] - '0');
                ccur /= 10;
            }
        } else if (s[i] == '.') {
            k = 2;
            ccur = 0.1;
        } else {
            if (s[i] == '-' && (i == 0 || s[i - 1] == '(')) {
                neg = -1;
            } else {
                if (k) {
                    token.push_back(new Expression());
                    token.back()->val = neg * cur;
                    cur = 0;
                    k = 0;
                    ccur = 0.1;
                    neg = 1;
                }
                token.push_back(new Expression());
                token.back()->op = s[i];
            }
        }
    }
    token.pop_back();
    stack<int> t;
    for (int i = 0; i < token.size(); ++i) {
        if (token[i]->op == '(') {
            t.push(i);
        }
        if (token[i]->op == ')') {
            brackets[i] = t.top();
            brackets[t.top()] = i;
            t.pop();
        }
    }
    Expression *root = create(0, token.size() - 1);
    return calculate(root);
}

string input() {
    string t;
    cin >> t;
    return t;
}

void print(double t) {
    printf("%.2lf", t);
}























int main() {
    print(eval(input()));
}
21 个赞

泰裤辣!!!

12 个赞

+1

11 个赞

泰剧了,前排滋滋 :heart_eyes:

10 个赞

太神秘力(大喜)

10 个赞

+1

11 个赞

这特么真酷啊!

9 个赞

为啥我会报错

10 个赞

????

10 个赞

不是我不李姐

9 个赞

+1(悲

9 个赞

我这里不会报错啊

9 个赞

悲伤溢满屏幕

8 个赞

连软件都欺负我

8 个赞

计算器,是不是

7 个赞

9999

5 个赞

!有点像!

6 个赞

确实是,是我们今天的题,要求要加减乘除幂运算小括号。

6 个赞

啊对对对,这道题巨坑,我们班写出来的四个只有RE90,更多是根本没写。

4 个赞

DEV-C++太老了,不支持nullptr,改成NULL即可,也可以加上:

#ifdef _WIN32
#define nullptr NULL
#endif