Pagini recente » Cod sursa (job #3211152) | Borderou de evaluare (job #1520820) | Cod sursa (job #103371) | Cod sursa (job #407731) | Cod sursa (job #818908)
Cod sursa(job #818908)
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<cmath>
using namespace std;
const char op[4]={'+','-','*','/'};
int polon[100010],m,n1,n=0;
char oper[100010],s[100010];
void asezare(char x)
{
if (x=='*' || x=='/') oper[++m]=x;
else { if (oper[m]=='*' || oper[m]=='/')
{
while (oper[m]=='*' || oper[m]=='/')
{
polon[n]=-oper[m];
n++;
m--;
}
oper[++m]=x;
}
else oper[++m]=x;
}
}
inline void tranzactie()
{
while (oper[m]!='(')
{
polon[n]=-oper[m];
n++;
m--;
}
m--;
return;
}
bool operatie(char x)
{
int i;
bool ok=false;
for(i=0;i<4;i++)
if (x==op[i]) ok=true;
return ok;
}
inline void polona()
{
int i;
for (i=0;i<n1;i++)
{
if (isdigit(s[i])) polon[n]=polon[n]*10+s[i]-48;
else { if (isdigit(s[i-1])) n++;
if (s[i]=='(') oper[++m]=s[i];
if (operatie(s[i])) asezare(s[i]);
if (s[i]==')') tranzactie();
}
}
}
void final()
{
while (m>0)
{
if (oper[m]!='(') polon[++n]=-oper[m];
m--;
}
}
inline int finder()
{
int i,j;
for (i=0;i<=n;i++)
if (polon[i]<0) return i;
}
inline int efectuare(int x,int y,char op)
{
if (op=='*') return x*y;
if (op=='/')return x/y;
if (op=='+') return x+y;
if (op=='-') return x-y;
}
inline void erase(int poz)
{
int i;
for (i=poz+2;i<=n;i++)
polon[i-2]=polon[i];
return ;
}
inline void evaluare()
{
int i,poz,nr;
while (n!=0)
{
poz=finder();
nr=efectuare(polon[poz-2],polon[poz-1],abs(polon[poz]));
erase(poz-1);
polon[poz-2]=nr;
n-=2;
}
return;
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
gets(s);
n1=strlen(s);
polona();
final();
evaluare();
printf("%d",polon[0]);
fclose(stdin);
fclose(stdout);
return 0;
}