Cod sursa(job #792511)
#include <cstdio>
#include <cstring>
using namespace std;
char expresie [100010];
void citire(){
gets (expresie);
}
int paranteza (int st, int dr){
int p = 1;
st ++;
while (st <= dr && p){
if (expresie [st] == ')'){
p --;
}
if (expresie [st] == '('){
p ++;
}
st ++;
}
if (st <= dr){
return 0;
}
if (p != 0){
return 0;
}
return 1;
}
int eval (int st, int dr){
// daca am o paranteza mare
if (expresie[st] == '(' && expresie[dr] == ')' && paranteza (st,dr)){
return eval (st + 1, dr - 1);
}
// verifica daca am + sau -
for (int i = dr; i >= st; i --){
if (expresie[i] == '+'){
return eval (st, i - 1) + eval (i + 1, dr);
}
if (expresie[i] == '-'){
return eval (st, i - 1) - eval (i + 1, dr);
}
// sare peste paranteza
if (expresie[i] == ')'){
int p = 1;
while (p){
i --;
if (expresie[i] == ')'){
p ++;
}
if (expresie[i] == '('){
p --;
}
}
}
}
// verifica daca am * sau /
for (int i = dr; i >= st; i --){
if (expresie[i] == '*'){
return eval (st, i - 1) * eval (i + 1, dr);
}
if (expresie[i] == '/'){
return eval (st, i - 1) / eval (i + 1, dr);
}
// sare peste paranteza
if (expresie[i] == ')'){
int p = 1;
while (p){
i --;
if (expresie[i] == ')'){
p ++;
}
if (expresie[i] == '('){
p --;
}
}
}
}
int x = 0;
for (int i = st; i <= dr; i ++){
x = x * 10 + expresie[i] - '0';
}
return x;
}
int main()
{
freopen ("evaluare.in", "r", stdin);
freopen ("evaluare.out", "w", stdout);
citire();
printf ("%d", eval (0, strlen(expresie) - 1));
return 0;
}