#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<stack>
using namespace std;
const int N = 1e5 + 5;
struct Number {
string s;
int type;//0: 数字, 1: -, 2: +, 3: X, 4: /, 5: ( ,6: )
Number(string s = "", int type = -1) :s(s), type(type) {}
};
char s[N];
vector<Number> v;
int idx;
double dfs() {
stack<double> stk;
int pre = 0;
while (idx < v.size()) {
if (v[idx].type == 0 || v[idx].type == 5) {
double now;
if (v[idx].type == 0) sscanf(v[idx].s.c_str(), "%lf", &now);
else idx++, now = dfs();
if (pre == 1) stk.push(-now);
else if (pre == 3) {
double tmp = stk.top();
stk.pop();
stk.push(tmp * now);
}
else if (pre == 4) {
double tmp = stk.top();
stk.pop();
stk.push(tmp / now);
}
else stk.push(now);
pre = 0;
}
else if (v[idx].type == 1) {
pre = 1;
}
else if (v[idx].type == 3) {
pre = 3;
}
else if (v[idx].type == 4) {
pre = 4;
}
else if (v[idx].type == 6) {
break;
}
idx++;
}
double ans = 0;
while (!stk.empty()) ans += stk.top(), stk.pop();
return ans;
}
int main() {
scanf("%s", s);
int n = strlen(s), pre = -1;
for (int i = 0; i < n; i++) {
int j = (int)v.size() - 1;
string tmp;
tmp += s[i];
if (s[i] == '.') {
v[j].s += s[i];
}
else if ('0' <= s[i] && s[i] <= '9') {
if (pre == 0) v[j].s += s[i];
else {
v.push_back(Number(tmp, 0));
pre = 0;
}
}
else if (s[i] == '-') {
v.push_back(Number(tmp, 1));
pre = 1;
}
else if (s[i] == '+') {
v.push_back(Number(tmp, 2));
pre = 2;
}
else if (s[i] == '*') {
v.push_back(Number(tmp, 3));
pre = 3;
}
else if (s[i] == '/') {
v.push_back(Number(tmp, 4));
pre = 4;
}
else if (s[i] == '(') {
v.push_back(Number(tmp, 5));
pre = 5;
}
else if (s[i] == ')') {
v.push_back(Number(tmp, 6));
pre = 6;
}
}
idx = 0;
printf("%.2f\n", dfs());
return 0;
}
百练 4132: 四则运算表达式求值
最新推荐文章于 2023-04-22 16:33:34 发布