Cod sursa(job #3151611)
Utilizator | Data | 22 septembrie 2023 02:11:43 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 10 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 2.63 kb |
#include <fstream>
#include <bitset>
#include <cstring>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
int st[100001];
char sir[100001];
int main()
{
cin>>sir;
int i,k=0,n=strlen(sir),nr=0,ok=0;
for(i=0;i<n;i++)
{
if(sir[i]>='0'&&sir[i]<='9')
{
nr=nr*10+sir[i]-'0';
ok=1;
}
else
{
if(ok==1)
{
if(st[k]==3)
{
k--;
st[k]*=nr;
}
else
if(st[k]==4)
{
k--;
st[k]/=nr;
}
else
st[++k]=nr;
nr=0;
ok=0;
}
if(sir[i]=='+')
st[++k]=1;
else
if(sir[i]=='-')
st[++k]=2;
else
if(sir[i]=='*')
st[++k]=3;
else
if(sir[i]=='/')
st[++k]=4;
else
if(sir[i]=='(')
st[++k]=5;
else
{
nr=0;
while(st[k-1]!=5)
{
if(st[k-1]==1)
nr+=st[k];
else
nr-=st[k];
k-=2;
}
nr+=st[k];
k-=2;
if(st[k]==3)
st[--k]=st[k]*nr;
else
if(st[k]==4)
st[--k]=st[k]/nr;
else
st[++k]=nr;
nr=0;
}
}
}
if(ok==1)
{
if(st[k]==3)
{
k--;
st[k]*=nr;
}
else
if(st[k]==4)
{
k--;
st[k]/=nr;
}
else
st[++k]=nr;
nr=0;
ok=0;
}
else
{
nr=0;
while(st[k-1]!=5)
{
if(st[k-1]==1)
nr+=st[k];
else
nr-=st[k];
k-=2;
}
nr+=st[k];
k-=2;
if(st[k]==3)
st[--k]=st[k]*nr;
else
if(st[k]==4)
st[--k]=st[k]/nr;
else
st[++k]=nr;
nr=0;
}
nr=st[1];
while(k>1)
{
if(st[k-1]==1)
nr+=st[k];
else
nr-=st[k];
k-=2;
}
cout<<nr;
return 0;
}