Pagini recente » Cod sursa (job #1213974) | Cod sursa (job #1090647) | Cod sursa (job #760116) | Cod sursa (job #1930626) | Cod sursa (job #2147180)
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100005
using namespace std;
char s[N], lungime;
int paranteze(int st, int dr)
{
int nr = 0;
for(int i = 0 ; i < lungime ; ++i)
{
if(s[i] == '(')
{
nr++;
}
if(s[i] == ')')
{
nr--;
}
}
if(!nr)
{
return true;
}
return false;
}
int semn_plus_minus(int st, int dr)
{
int nr = 0;
for(int i = dr ; i >= st ; --i)
{
if(s[i] == '(')
{
nr++;
}
if(s[i] == ')')
{
nr--;
}
if((s[i] == '+' || s[i] == '-') && nr == 0)
{
return i;
}
}
return -1;
}
int semn_steluta_slash(int st, int dr)
{
int nr = 0;
for(int i = dr ; i >= st ; --i)
{
if(s[i] == '(')
{
nr++;
}
if(s[i] == ')')
{
nr--;
}
if((s[i] == '*' || s[i] == '/') && nr == 0)
{
return i;
}
}
return -1;
}
int back_(int st, int dr)
{
if(s[st] == '(' && s[dr] == ')' && paranteze(st + 1, dr - 1))
{
return back_(st + 1, dr - 1);
}
int poz = semn_plus_minus(st, dr);
if(poz >= 0)
{
switch(s[poz])
{
case '+': return back_(st, poz - 1) + back_(poz + 1, dr);
case '-': return back_(st, poz - 1) - back_(poz + 1, dr);
}
}
poz = semn_steluta_slash(st, dr);
if(poz >= 0)
{
switch(s[poz])
{
case '*': return back_(st, poz - 1) * back_(poz + 1, dr);
case '/': return back_(st, poz - 1) / back_(poz + 1, dr);
}
}
int x = 0;
for(int i = st ; i <= dr ; ++i)
{
x = x * 10 + (s[i] - '0');
}
return x;
}
void citire()
{
fgets(s, N, stdin);
lungime = strlen(s);
if(s[lungime - 1] == '\n')
{
s[lungime - 1] = 0;
lungime--;
}
printf("%d", back_(0, lungime - 1));
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
citire();
return 0;
}