#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 个赞
泰剧了,前排滋滋 ![]()
10 个赞
太神秘力(大喜)
10 个赞
+1
11 个赞
这特么真酷啊!
9 个赞
为啥我会报错
10 个赞
????
10 个赞
+1(悲
9 个赞
我这里不会报错啊
9 个赞
悲伤溢满屏幕
8 个赞
连软件都欺负我
8 个赞
计算器,是不是
7 个赞
9999
5 个赞
!有点像!
6 个赞
确实是,是我们今天的题,要求要加减乘除幂运算小括号。
6 个赞
啊对对对,这道题巨坑,我们班写出来的四个只有RE90,更多是根本没写。
4 个赞
DEV-C++太老了,不支持nullptr,改成NULL即可,也可以加上:
#ifdef _WIN32
#define nullptr NULL
#endif
