Pagini recente » Cod sursa (job #2048349) | Cod sursa (job #2642718) | Cod sursa (job #1128088) | Cod sursa (job #1243628) | Cod sursa (job #1963207)
#include <iostream>
#include <cstdio>
#include <cstring>
#define NMAX 100005
using namespace std;
char tmp[NMAX];
int para[NMAX];
void parantezare()
{
int loc[NMAX];
int l = 0;
for (int i=0; i<strlen(tmp); i++)
{
if (tmp[i] == '(')
loc[l++] = i;
else if (tmp[i] == ')')
{
para[i] = loc[l-1];
para[loc[l-1]] = i;
l--;
}
}
}
int evaluare(int st = 0, int dr = strlen(tmp)-1)
{
if(tmp[st] == '(' && para[st] == dr)
return evaluare(st+1, dr-1);
for (int i=dr; i>=st; i--)
{
if (tmp[i] == ')')
i = para[i];
if (tmp[i] == '+')
return evaluare(st, i-1) + evaluare(i+1, dr);
else if (tmp[i] == '-')
return evaluare(st, i-1) - evaluare(i+1, dr);
}
for (int i=dr; i>=st; i--)
{
if (tmp[i] == ')')
i = para[i];
if (tmp[i] == '*')
return evaluare(st, i-1) * evaluare(i+1, dr);
else if (tmp[i] == '/')
return evaluare(st, i-1) / evaluare(i+1, dr);
}
int nr;
sscanf(tmp + st, "%d", &nr);
return nr;
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
gets(tmp);
parantezare();
cout<<evaluare();
return 0;
}