Cod sursa(job #527005)
#include<stdio.h>
#include<string.h>
#define N 100001
typedef struct stack
{char st[N];
long sp;};
typedef struct stiva
{long v[N],n;};
char inf[N],postf[N];
void add(stiva &s,long nr)
{s.v[++s.n]=nr;}
long del(stiva &s)
{return s.v[s.n--];}
void push(stack &s,char ch)
{s.st[++s.sp]=ch;}
char pop(stack &s)
{return s.st[s.sp--];}
char top(stack s)
{return s.st[s.sp];}
long calc(long x,long y,char ch)
{if(ch=='+')
return x+y;
if(ch=='-')
return x-y;
if(ch=='*')
return x*y;
return x/y;}
long eval(char postf[N])
{stiva q;
char ch;
long i=0,nr,t1,t2;
q.n=0;
while(i<strlen(postf)-2)
{while(postf[i]==' ')
i++;
ch=postf[i];
if(ch>='0'&&ch<='9')
{nr=0;
while(postf[i]>='0'&&postf[i]<='9')
{nr=nr*10+(postf[i]-'0');
i++;}
add(q,nr);}
else
{t2=del(q);
t1=del(q);
add(q,calc(t1,t2,ch));
i++;}}
return del(q);}
int pri(char ch)
{int k,n=5,pr[]={0,1,1,2,2};
char v[]={'(','+','-','*','/'};
for(k=0;k<n;k++)
if(ch==v[k])
return pr[k];
return -1;}
void topostf(char in[N],char out[N])
{stack s;
char ch,op;
s.sp=0;
long i=0,j=0,r;
while(i<strlen(in))
{ch=in[i++];
if(ch>='0'&&ch<='9')
out[j++]=ch;
else
{if(ch=='(')
push(s,ch);
else
{if(ch==')')
{while(s.sp!=0&&((r=pop(s))!='('))
out[j++]=r;}
else
{while(s.sp!=0&&pri(ch)<pri(top(s)))
out[j++]=pop(s);
push(s,ch);}}
out[j++]=' ';}}
while(s.sp!=0)
out[j++]=pop(s);
out[j]='\0';}
int main()
{freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
gets(inf);
topostf(inf,postf);
printf("%ld\n",eval(postf));
fclose(stdin);
fclose(stdout);
return 0;}