Pagini recente » Cod sursa (job #1394162) | Cod sursa (job #1979275) | Cod sursa (job #149063) | Cod sursa (job #1599931) | Cod sursa (job #659809)
Cod sursa(job #659809)
#include<fstream>
#include<cstring>
#define inf 2000000000
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char s[100010],c;
int n,m,x[100010],p[100010],pc,k,nr[100010];
int putere(int a, int b)
{
int put=1;
for(int i=1;i<=b;i++)
put*=a;
return put;
}
void adaug(int i)
{
if(k&&p[i]!=inf)
{
switch (s[i])
{
case '*': k-=2;x[k]=x[k]*x[k+1];k++;break;
case '/': k-=2;x[k]=x[k]/x[k+1];k++;break;
case '^': k-=2;x[k]=putere(x[k],x[k+1]);k++;break;
case '+': k-=2;x[k]=x[k]+x[k+1];k++;break;
case '-': k-=2;x[k]=x[k]-x[k+1];k++;break;
}
}
else
x[k++]=nr[i];
}
void divide(int i, int j)
{
if(i==j)
{ adaug(i);return;}
int imin,minn=inf+1;
for(int l=j;l>=i;l--)
if(p[l]<minn)
{
minn=p[l];
imin=l;
}
divide(i,imin-1);
divide(imin+1,j);
adaug(imin);
}
int main()
{
f.get(s[n]);
do
{
if(isdigit(s[n]))
{
p[m]=inf;
if(isdigit(c))
nr[m]=nr[m]*10+s[n]-'0';
else
nr[m]=s[n]-'0';
c=s[n];
f.get(s[n]);
if(!isdigit(s[n]))
{ s[++n]=s[n-1];s[n-1]=c;m++;}
}
else
{
c=s[n];
switch (s[n])
{
case '(': pc+=10;f.get(s[n]); break;
case ')': pc-=10;f.get(s[n]);break;
case '*': p[m++]=pc+2; f.get(s[++n]);break;
case '/': p[m++]=pc+2; f.get(s[++n]);break;
case '^': p[m++]=pc+3; f.get(s[++n]);break;
case '+': p[m++]=pc+1; f.get(s[++n]);break;
case '-': p[m++]=pc+1; f.get(s[++n]);break;
}
}
} while(s[n]!='\n');
divide(0,n-1);
g<<x[0];
g.close();
f.close();
return 0;
}