Pagini recente » Cod sursa (job #573489) | Rating Bacila Emilian (bacila) | Cod sursa (job #1463413) | Cod sursa (job #3289308) | Cod sursa (job #3176716)
#include <cstdio>
#include <cassert>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string expr;
vector<vector<char>> ops = {{'+', '-'}, {'*', '/'}};
int applyOp(int lhs, int rhs, char op) {
switch (op) {
case '+': {
return lhs + rhs;
}
case '-': {
return lhs - rhs;
}
case '*': {
return lhs * rhs;
}
case '/': {
return lhs / rhs;
}
}
}
int eval(string& expr, int& idx, int priority) {
if (priority == ops.size()) {
assert(isdigit(expr[idx]) || expr[idx] == '(');
if (isdigit(expr[idx])) {
int result = 0;
while (idx < expr.size() && isdigit(expr[idx])) {
result = result * 10 + expr[idx++] - '0';
}
return result;
} else if (expr[idx] == '(') {
int result = eval(expr, ++idx, 0);
idx++;
return result;
}
}
int result = eval(expr, idx, priority + 1);
while (idx < expr.size() && find(ops[priority].begin(), ops[priority].end(), expr[idx]) != ops[priority].end()) {
char op = expr[idx++];
result = applyOp(result, eval(expr, idx, priority + 1), op);
}
return result;
}
int main() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
cin >> expr;
int idx = 0;
cout << eval(expr, idx, 0) << "\n";
return 0;
}