Pagini recente » Cod sursa (job #1072610) | Cod sursa (job #1780582) | Cod sursa (job #1831858) | Cod sursa (job #2669385) | Cod sursa (job #2147251)
#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 = st ; i <= dr ; ++i)
{
if(s[i] == '(')
{
nr++;
}
if(s[i] == ')')
{
nr--;
}
if(nr < 0)
{
return false;
}
}
if(!nr)
{
return true;
}
return false;
}
int semne(int st, int dr, char c1, char c2)
{
int nr = 0;
for(int i = dr ; i >= st ; --i)
{
if(s[i] == '(')
{
nr++;
}
if(s[i] == ')')
{
nr--;
}
if((s[i] == c1 || s[i] == c2) && 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 = semne(st, dr, '+', '-');
if(poz >= 0)
{
switch(s[poz])
{
case '+': return back_(st, poz - 1) + back_(poz + 1, dr); break;
case '-': return back_(st, poz - 1) - back_(poz + 1, dr); break;
}
}
poz = semne(st, dr, '*', '/');
if(poz >= 0)
{
switch(s[poz])
{
case '*': return back_(st, poz - 1) * back_(poz + 1, dr); break;
case '/': return back_(st, poz - 1) / back_(poz + 1, dr); break;
}
}
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;
}