Pagini recente » Cod sursa (job #278887) | Cod sursa (job #732761) | Cod sursa (job #1044222) | Cod sursa (job #549430) | Cod sursa (job #567288)
Cod sursa(job #567288)
#include<fstream>
using namespace std;
char v[100001],st[100001],expr[100001];
long y[100001];
int vf,nr;
void rezultat()
{int i,p=1,k=0;
for(i=0;expr[i];i++)
{if(isdigit(expr[i]))
y[k]=y[k]*p+expr[i]-48,p*=10;
else
if(expr[i]=='.')
k++,p=1;
else
{switch(expr[i])
{case '+':y[k-2]=y[k-1]+y[k-2];break;
case '-':y[k-2]=y[k-2]-y[k-1];break;
case '*':y[k-2]=y[k-1]*y[k-2];break;
case '/':y[k-2]=y[k-2]/y[k-1];break;
}k-=1;y[k]=0;}
}
}
char pop()
{if(nr>=1) {nr--;return st[nr];}
return 0;
}
void push(char c)
{st[nr]=c;nr++;
}
void evaluare()
{int i,n;
char c;
n=strlen(v);
for(i=0;i<n;i++)
{if(isdigit(v[i])) {
while(isdigit(v[i]))
{expr[vf]=v[i];
vf++,i++;
}
expr[vf]='.',vf++;}
switch(v[i])
{case '(':push(v[i]);break;
case ')':while((c=pop())!='(') expr[vf++]=c;break;
case '/':
case '*':if(strchr("(+-",st[nr-1])||(nr==-1)) push(v[i]);
else
if(strchr("*/",st[nr-1])){expr[nr]=pop();nr++;i--;}break;
case '+':
case '-':if(st[nr-1]=='('||nr==0) push(v[i]);
else expr[vf]=pop(),vf++,i--;break;
}
}
while((c=pop())!=0) expr[vf]=c,vf++;
expr[vf]=0,vf++;
}
int main()
{
ifstream in("evaluare.in");
in.get(v,100000);
in.close();
evaluare();
rezultat();
ofstream out("evaluare.out");
out<<y[0]<<'\n';
out.close();
return 0;
}