Pagini recente » Cod sursa (job #1653649) | Cod sursa (job #2890963) | Cod sursa (job #853936) | Cod sursa (job #584364) | Cod sursa (job #1517706)
#include<iostream>
#include<fstream>
#include<cmath>
#include<string>
#include<cctype>
#define m 2000000000
using namespace std;
fstream fin("evaluare.in",ios::in),fout("evaluare.out",ios::out);
string s;
int x[10000],p[10000];
int numar(int&i)
{
int aux=0;
while(isdigit(s[i]))
{
aux=aux*10+(s[i]-'0');
i++;
}
i--;
return aux;
}
int search(int start,int stop)
{
int i,minim=m,pmin;
for(i=start;i<=stop;i++)
{
if(p[i]<minim)
{
minim=p[i];
pmin=i;
}
}
return pmin;
}
int calc(int a,int c,int b)
{
if(c==m+1) return a+b;//+
if(c==m+2) return a-b;//-
if(c==m+3) return a*b;//*
if(c==m+4) return a/b;// /
if(c==m+5) return pow(a,b);//^
}
int rec(int start,int stop)
{
int a,b,c;
if(start<stop)
{
c=search(start,stop);
a=rec(start,c-1);
b=rec(c+1,stop);
return calc(a,x[c],b);
}
else
{
return x[start];
}
}
int main()
{
int i,adaos=0,siz,grad1=1,grad2=10,grad3=100,gradn=10000,lx=0;
fin>>s;
siz=s.size();
for(i=0;i<siz;i++)
{
if(s[i]=='(') adaos+=100;
if(s[i]==')') adaos-=100;
if(s[i]=='+') x[lx]=m+1,p[lx++]=grad1+adaos;
if(s[i]=='-') x[lx]=m+2,p[lx++]=grad1+adaos;
if(s[i]=='*') x[lx]=m+3,p[lx++]=grad2+adaos;
if(s[i]=='/') x[lx]=m+4,p[lx++]=grad2+adaos;
if(s[i]=='^') x[lx]=m+5,p[lx++]=grad3+adaos;
if(isdigit(s[i])) x[lx]=numar(i),p[lx++]=gradn;
}
fout<<rec(0,lx-1);
return 0;
}