Pagini recente » Cod sursa (job #3320529) | Cod sursa (job #3320532) | Cod sursa (job #3320528) | Cod sursa (job #3322786) | Cod sursa (job #1615005)
#include <fstream>
using namespace std;
const int MAX_N = 100000;
char E[MAX_N + 1];
char op[MAX_N];
int ST[MAX_N];
int priority[256];
int main() {
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
fin.tie(0);
ios_base::sync_with_stdio(false);
int opStack, ss;
fin >> E; fin.close();
priority['*'] = 2; priority['/'] = 2;
priority['+'] = 1; priority['-'] = 1;
auto doOp = [&] () -> void {
if (op[opStack] == '+') {
ST[ss - 1] += ST[ss];
} else if (op[opStack] == '-') {
ST[ss - 1] -= ST[ss];
} else if (op[opStack] == '*') {
ST[ss - 1] *= ST[ss];
} else {
ST[ss - 1] /= ST[ss];
}
};
op[0] = '$';
opStack = 1;
ss = 0;
for (int i = 0; E[i]; ++ i) {
if (E[i] == '(') {
op[opStack++] = '(';
} else if (E[i] == ')') {
while (op[--opStack] != '(') {
ss--;
doOp();
}
} else {
if (isdigit(E[i])) {
if (i == 0 || !isdigit(E[i - 1])) {
ST[ss++] = 0;
}
ST[ss - 1] = (10 * ST[ss - 1] + (E[i] - '0'));
} else {
while (priority[op[opStack - 1]] >= priority[E[i]]) {
ss--;
opStack--;
doOp();
}
op[opStack++] = E[i];
}
}
}
while (opStack > 1) {
ss--;
opStack--;
doOp();
}
fout << ST[0] << '\n';
fout.close();
return 0;
}