Pagini recente » Algoritmiada 2010 - Clasament general, Clasele 5-8 | Diferente pentru problema/pamant intre reviziile 5 si 2 | Statistici Rafael (xpilov) | Cod sursa (job #1341371) | Cod sursa (job #3208747)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
double st1[100001];
int st2[100001];
char sir[100001];
double calc(double a, double b, int c)
{
if(c==-1)
return a*b;
else
if(c==-2)
return a/b;
else
if(c==-3)
return a+b;
else
return a-b;
}
int main()
{
cin>>sir;
int n=strlen(sir),i,k1,k2=k1=0,nr=0,ok;
for(i=0;i<n;i++)
{
if(sir[i]>='0'&&sir[i]<='9')
{
ok=1;
nr=nr*10+sir[i]-'0';
}
else
{
if(ok==1)
{
ok=0;
///cout<<nr<<" ";
st1[++k1]=nr;
nr=0;
}
if(sir[i]=='(')
st2[++k2]=0;
else
if(sir[i]==')')
{
while(st2[k2]<0)
{
/// cout<<st2[k2]<<" ";
st1[k1-1]=calc(st1[k1-1],st1[k1],st2[k2]);
k1--;
k2--;
}
k2--;
}
else
if(sir[i]=='+'||sir[i]=='-')
{
while(k2>0&&st2[k2]<0)
{
///cout<<st2[k2]<<" ";
st1[k1-1]=calc(st1[k1-1],st1[k1],st2[k2]);
k1--;
k2--;
}
k2++;
if(sir[i]=='+')
st2[k2]=-3;
else
st2[k2]=-4;
}
else
{
while(k2>0&&(st2[k2]==-1||st2[k2]==-2))
{
///cout<<st2[k2]<<" ";
st1[k1-1]=calc(st1[k1-1],st1[k1],st2[k2]);
k1--;
k2--;
}
if(sir[i]=='*')
st2[++k2]=-1;
else
st2[++k2]=-2;
}
}
}
if(ok==1)
{
/// cout<<nr<<" ";
st1[++k1]=nr;
}
while(k2>0)
{
/// cout<<st2[k2]<<" ";
st1[k1-1]=calc(st1[k1-1],st1[k1],st2[k2]);
k1--;
k2--;
}
cout<<st1[1];
return 0;
}