Pagini recente » Cod sursa (job #451216) | Cod sursa (job #2454538) | Cod sursa (job #2449138) | Cod sursa (job #3184041) | Cod sursa (job #1853741)
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
char sts[100001],s[100010];
int stn[100001],vfs=-1,vsn=0;
int pr(char op)
{
if(op=='('||op==')')return 0;
if(op=='+'||op=='-')return 1;
if(op=='*'||op=='/')return 2;
return -1;
}
int main()
{
FILE *f=fopen("evaluare.in","r");
s[0]='(';
fgets(s+1,100009,f);
int n=strlen(s),sgn,i;
if(s[n-1]=='\n')s[n--]=0;
s[n++]=')';s[n]=0;
stn[0]=0;sgn=1;
for(i=0;i<n;i++)
{
if(isdigit(s[i])){stn[vsn]=stn[vsn]*10+s[i]-'0';continue;}
else if(isdigit(s[i-1])){
stn[vsn]*=sgn;
stn[++vsn]=0;sgn=1;
}
if(s[i]=='(') {sts[++vfs]='(';continue;}
//verific daca s[i] este un semn unar
if(pr(s[i])==1 && pr(s[i-1])!=-1 && s[i-1]!=')')
{//deci e vorba de un semn unar
if(s[i]=='-')sgn=-1;continue;
}
if(pr(s[i])>pr(sts[vfs]))
{sts[++vfs]=s[i];continue;}
//deci n-a ramas decit cazul cu calcule
vsn--;
while(pr(sts[vfs])>=pr(s[i]))
{
if(sts[vfs]=='+')
{stn[vsn-1]+=stn[vsn];vsn--;}
else
if(sts[vfs]=='-')
{stn[vsn-1]-=stn[vsn];vsn--;}
else
if(sts[vfs]=='*')
{stn[vsn-1]*=stn[vsn];vsn--;}
else if(sts[vfs]=='/')
{stn[vsn-1]/=stn[vsn];vsn--;}
if(sts[vfs]=='('){vfs--;break;}
vfs--;
}
if(s[i]!=')')sts[++vfs]=s[i];
stn[++vsn]=0;
}
f=fopen("evaluare.out","w");
fprintf(f,"%d",stn[0]);
return 0;
}