Cod sursa(job #1826679)
Utilizator | Data | 10 decembrie 2016 18:52:06 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.76 kb |
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout("evaluare.out");
char c[100010],a[100010],k;
int b[100010],vl[260];
int x,y,i,n,d;
bool ok;
bool nr()
{
if (c[i]>='0' && c[i]<='9') return 1;
return 0;
}
bool op()
{
if (k=='+' ||
k=='-' ||
k=='*' ||
k=='/' ||
k=='(' )
return 1;
return 0;
}
void tr()
{
int m;int n;
m=b[y-1]; n=b[y];
--y;
switch (a[x])
{
case '+' : { b[y]=m+n ; break; }
case '-' : { b[y]=m-n ; break; }
case '*' : { b[y]=m*n ; break; }
case '/' : { b[y]=m/n ; break; }
}
--x;
}
int main()
{
fin.getline (c+1,100010);
n=strlen(c+1);
vl['(']=1;
vl['+']=vl['-']=2;
vl['*']=vl['/']=3;
c[0]='(';
c[n+1]=')';
for (i=0;i<=n+1;++i)
{
k=c[i];
if (nr())
{
d=k-'0';
++i;
while (nr())
{
d*=10;
d+=(c[i]-'0');
++i;
}
--i;
b[++y]=d;
}
else
if (op())
{
if (vl[c[i]] < vl[a[x]])
{
ok=0;
if (a[x]!='(')
{
ok=1;
}
tr(); //--xy
if (ok)
{
--i;
}
}
else
{
a[++x]=c[i];
}
}
else
{
while (a[x]!='(')
{
tr();
}
}
}
fout << b[1];
return 0;
}