Pagini recente » Cod sursa (job #1182627) | Cod sursa (job #185172) | Cod sursa (job #1399102) | Cod sursa (job #405523) | Cod sursa (job #2727561)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
int sl;
char s[NMAX + 1];
inline int applyOp(const int X, const int Y, const char OP) {
if(OP == '+') return X + Y;
if(OP == '-') return X - Y;
if(OP == '*') return X * Y;
return X / Y;
}
inline int opVal(const char X) {
if(X == '+' || X == '-') return 1;
else if(X == '*' || X == '/') return 2;
return 0;
}
int eval() {
stack<int> vals;
stack<char> ops;
for(int i = 0; i < sl; ++i)
if(s[i] == '(') ops.push(s[i]);
else if(s[i] == ')') {
while(!ops.empty() && ops.top() != '(') {
int val2 = vals.top(); vals.pop();
int val1 = vals.top(); vals.pop();
char op = ops.top(); ops.pop();
vals.push(applyOp(val1, val2, op));
}
if(!ops.empty()) ops.pop();
} else if(isdigit(s[i])) {
int nr = 0;
while(i < sl && isdigit(s[i])) nr = nr * 10 + s[i] - '0', ++i;
vals.push(nr), --i;
} else {
while(!ops.empty() && opVal(ops.top()) >= opVal(s[i])) {
int val2 = vals.top(); vals.pop();
int val1 = vals.top(); vals.pop();
char op = ops.top(); ops.pop();
vals.push(applyOp(val1, val2, op));
}
ops.push(s[i]);
}
while(!ops.empty()) {
int val2 = vals.top(); vals.pop();
int val1 = vals.top(); vals.pop();
char op = ops.top(); ops.pop();
vals.push(applyOp(val1, val2, op));
}
return vals.top();
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
scanf("%s", s), sl = strlen(s), printf("%d", eval());
return 0;
}