Pagini recente » Cod sursa (job #1355121) | Cod sursa (job #349396) | Cod sursa (job #73149) | Cod sursa (job #46031) | Cod sursa (job #2345875)
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100005
using namespace std;
char s[N];
int l;
int cauta_adunare_scadere(int st, int dr)
{
int nr=0;
for(int i=dr;i>=st;i--)
if((s[i]=='-' || s[i]=='+') && !nr)
return i;
else
if(s[i]==')')
nr++;
else
if(s[i]=='(')
nr--;
return -1;
}
int cauta_inmultire_impartire(int st, int dr)
{
int nr=0;
for(int i=dr;i>=st;i--)
if((s[i]=='/' || s[i]=='*') && !nr)
return i;
else
if(s[i]==')')
nr++;
else
if(s[i]=='(')
nr--;
return -1;
}
int numar(int st, int dr)
{
int nr=0;
for(int i=st;i<=dr;i++)
nr=nr*10+s[i]-'0';
return nr;
}
int evaluare(int st, int dr)
{
if(s[st]=='(' && s[dr]==')')
return evaluare(st+1, dr-1);
int ind=cauta_adunare_scadere(st, dr);
if(ind!=-1)
{
int rez1=evaluare(st, ind-1);
int rez2=evaluare(ind+1, dr);
if(s[ind]=='+')
return rez1+rez2;
return rez1-rez2;
}
ind=cauta_inmultire_impartire(st, dr);
if(ind!=-1)
{
int rez1=evaluare(st, ind-1);
int rez2=evaluare(ind+1, dr);
if(s[ind]=='*')
return rez1*rez2;
return rez1/rez2;
}
return numar(st, dr);
}
int main()
{
freopen("evaluator.in", "r", stdin);
freopen("evaluator.out", "w", stdout);
cin.getline(s, N);
l=strlen(s)-1;
int rez=evaluare(0, l);
printf("%d", rez);
return 0;
}