Pagini recente » Cod sursa (job #331735) | Cod sursa (job #364748) | Cod sursa (job #485642) | Cei mai harnici utilizatori info-arena | Cod sursa (job #909519)
Cod sursa(job #909519)
#include <cstdio>
#include <cstring>
#define nMax 100010
using namespace std;
char c[nMax];
int n;
void citire(){
gets(c);
n = strlen(c);
}
int parantezaMare(int st, int dr){
int p = 1;
int i = st + 1;
for(; p; ++ i){
if(c[i] == '('){
p ++;
}
if(c[i] == ')'){
p--;
}
}
return !p && i >= dr;
}
void sari(int &i){
int p = 1;
i --;
while(p){
if(c[i] == '('){
p --;
}
if(c[i] == ')'){
p ++;
}
i --;
}
i ++;
}
int eval(int st, int dr){
if(c[st] == '(' && c[dr - 1] == ')'){
if(parantezaMare(st,dr)){
return eval(st + 1, dr - 1);
}
}
for(int i = dr - 1; i >= st; -- i){
if(c[i] == ')'){
sari(i);
continue;
}
if(c[i] == '+'){
return eval(st, i) + eval(i + 1, dr);
}
if(c[i] == '-'){
return eval(st, i) - eval(i + 1, dr);
}
}
for(int i = dr - 1; i >= st; -- i){
if(c[i] == ')'){
sari(i);
continue;
}
if(c[i] == '*'){
return eval(st, i) * eval(i + 1, dr);
}
if(c[i] == '/'){
return eval(st, i) / eval(i + 1, dr);
}
}
int x;
sscanf(c + st, "%d", &x);
return x;
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
citire();
printf("%d\n", eval(0, n));
return 0;
}