Cod sursa(job #2573011)
Utilizator | Data | 5 martie 2020 15:22:36 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 70 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 3.98 kb |
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char a[1000001];
long long k, q, fp[100001], st[100001] ;
int main()
{
fin>>a;
for(int i=0; i<strlen(a); i++)
{
if(a[i]=='+' || a[i]=='-' || a[i]=='*' || a[i]=='/' || a[i]=='(')
{
if((a[i]=='*' || a[i]=='/') && (st[k]==-3 || st[k]==-4 ))
{
while(st[k]==-3 || st[k]==-4 && k!=0)
{if(st[k]==-3)
fp[++q]=-3;
else
fp[++q]=-4;
k--;
}
if(a[i]=='*')
st[++k]=-3;
else
st[++k]=-4;
}
if((a[i]=='*' || a[i]=='/') && (st[k]==-1 || st[k]==-2 || st[k]==-5 || k==0) )
{
if(a[i]=='*')
st[++k]=-3;
else
st[++k]=-4;
}
if(a[i]=='(')
st[++k]=-5;
if((a[i]=='+' || a[i]=='-') && st[k]!=-5 && k!=0)
{
while(st[k]!=-5 && k!=0)
{
if(st[k]==-3)
fp[++q]=-3;
else
{if(st[k]==-1)
fp[++q]=-1;
else
{if(st[k]==-2)
fp[++q]=-2;
else
if(st[k]==-4)
fp[++q]=-4;
}
}
k--;
}
if(a[i]=='+')
st[++k]=-1;
else
st[++k]=-2;
}
if((a[i]=='+' || a[i]=='-') && (st[k]==-5 || k==0))
{if(a[i]=='+')
st[++k]=-1;
else
st[++k]=-2;
}
}
else
{
if(a[i]==')')
{
while(st[k]!=-5)
{
if(st[k]==-3)
fp[++q]=-3;
else
{if(st[k]==-1)
fp[++q]=-1;
else
{if(st[k]==-2)
fp[++q]=-2;
else
if(st[k]==-4)
fp[++q]=-4;
}
}
k--;
}
k--;
}
else
{if(a[i-1]<48 && i>0)
fp[++q]=a[i]-48;
else
fp[q]=fp[q]*10 +(a[i]-48);
}
}
}
while(k!=0)
{
if(st[k]==-3)
{fp[++q]=-3;
k--;
}
else
{if(st[k]==-1)
fp[++q]=-1;
else
{if(st[k]==-2)
fp[++q]=-2;
else
if(st[k]==-4)
fp[++q]=-4;
}
k--;}
}
for(int i=1; i<=q; i++)
{
if(fp[i]<0)
{
if(fp[i]==-1)
fp[i]=fp[i-2]+fp[i-1];
else
{if(fp[i]==-2)
fp[i]=fp[i-2]-fp[i-1];
else
{if(fp[i]==-3)
fp[i]=fp[i-2]*fp[i-1];
else
fp[i]=fp[i-2]/fp[i-1];}
}
int y=i;
for(int d=i-3; d>=1 && y>1; d--, y--)
{
fp[y-1]=fp[d];
}
if(i!=q)
i=i-2;
}
}
fout<<fp[q];
return 0;
}