Pagini recente » Cod sursa (job #1033632) | Cod sursa (job #2101717) | Cod sursa (job #1964738) | Cod sursa (job #2522831) | Cod sursa (job #2698929)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int st[NMAX];
char c[NMAX];
// notatii:
// '+' = -2
// '-' = -3
// '*' = -4
// '/' = -5
// nimic = -6
int main()
{
int top=0,val=-1,i,j,p,x;
fin>>c;
for(i=0;c[i];i++)
{
char ch=c[i];
if(ch=='(')
st[++top]=-1;
else if(ch=='+')
{
if(val>=0)
st[++top]=val, val=-1;
st[++top]=-2;
}
else if(ch=='-')
{
if(val>=0)
st[++top]=val, val=-1;
st[++top]=-3;
}
else if(ch=='*')
{
if(val>=0)
st[++top]=val, val=-1;
st[++top]=-4;
}
else if(ch=='/')
{
if(val>=0)
st[++top]=val, val=-1;
st[++top]=-5;
}
else if(isdigit(ch))
if(val==-1)
val=ch-'0';
else
val=val*10+(ch-'0');
else if(ch==')')
{
if(val>=0)
st[++top]=val, val=-1;
for(j=top;st[j]!=-1;j--)
;
x=st[j+1];
for(p=j+3;p<=top;p+=2)
{
if(st[p+1]==-4||st[p+1]==-5)
{
int rez=st[p];
for(int k=p+1;k<=top;k+=2)
{
if(st[k]==-4)
rez*=st[k+1];
else if(st[k]==-5)
rez/=st[k+1];
else
break;
st[k]=st[k+1]=-6;
}
st[p]=rez;
}
if(st[p-1]==-2&&st[p]!=-6)
x+=st[p];
else if(st[p-1]==-3&&st[p]!=-6)
x-=st[p];
}
top=j;
st[top]=x;
}
}
if(val>=0) st[++top]=val;
/*for(int i=1;i<=top;i++)
if(st[i]!=-6)
cout<<st[i]<<" ";*/
x=0;
for(i=1;i<=top;i+=2)
{
if(st[i+1]==-4||st[i+1]==-5)
{
int rez=st[i];
for(int k=i+1;k<=top;k+=2)
{
if(st[k]==-4)
rez*=st[k+1];
else if(st[k]==-5)
rez/=st[k+1];
else
break;
st[k]=st[k+1]=-6;
}
//cout<<i<<" "<<rez<<" ";
st[i]=rez;
//cout<<i<<" "<<st[i]<<"\n";
}
}
x=st[1];
for(int i=3;i<=top;i+=2)
{
if(st[i-1]==-2&&st[i]!=-6)
x+=st[i];
else if(st[i-1]==-3&&st[i]!=-6)
x-=st[i];
}
fout<<x;
return 0;
}