Pagini recente » Cod sursa (job #2523846) | Cod sursa (job #2466589) | Cod sursa (job #1433581) | Cod sursa (job #1609669) | Cod sursa (job #2302297)
#include <cstdio>
#include <string>
#include <cctype>
#include <iostream>
#include <algorithm>
using namespace std;
const int NINF = -2.e9 - 1;
long long fp[100005] , ok;
char op[100005];
string s , s1;
inline int priority(char ch)
{
if(ch == '(')
return -1;
if(ch == ')')
return -2;
if(ch == '+' || ch == '-')
return 1;
return 2;
}
inline void modifica(int top1 , int top2)
{
if(op[top2] == '*')
fp[top1 - 1] = fp[top1 - 1] * fp[top1];
else if(op[top2] == '/')
{
if(fp[top1] == 0)
ok = 0;
else
fp[top1 - 1] = fp[top1 - 1] / fp[top1];
}
else if(op[top2] == '%')
{
if(fp[top1] == 0)
ok = 0;
else
fp[top1 - 1] = fp[top1 - 1] % fp[top1];
}
else if(op[top2] == '+')
fp[top1 - 1] = fp[top1 - 1] + fp[top1];
else
fp[top1 - 1] = fp[top1 - 1] - fp[top1];
}
inline long long formapoloneza()
{
int i , top1 , top2 , nr;
top1 = top2 = 0;
ok = 1;
for(i = 0 ; i <= s.length() ; i ++)
if(isdigit(s[i]))
{
if(i > 1 && s[i - 1] == '-' && s[i - 2] == '(')
fp[++ top1] = 0;
nr = 0;
while(i < s.length() && isdigit(s[i]))
{
nr = nr * 10 + s[i] - '0';
i ++;
}
i --;
fp[++ top1] = nr;
}
else
{
if(priority(s[i]) == -1)
op[++ top2] = s[i];
else if(priority(s[i]) == -2)
{
while(op[top2] != '(')
{
modifica(top1 , top2);
if(ok == 0)
return NINF;
top1 --;
top2 --;
}
top2 --;
}
else
{
while(top2 > 0 && priority(s[i]) <= priority(op[top2]) && priority(op[top2]) != -1)
{
modifica(top1 , top2);
if(ok == 0)
return NINF;
top1 --;
top2 --;
}
op[++ top2] = s[i];
}
}
return fp[1];
}
int main()
{
freopen("evaluare.in" , "r" , stdin);
freopen("evaluare.out" , "w" , stdout);
int i;
s.push_back('(');
getline(cin , s1);
s = s + s1;
s.push_back(')');
printf("%d\n" , formapoloneza());
return 0;
}