Pagini recente » Cod sursa (job #3283867) | Cod sursa (job #1549418) | Cod sursa (job #1951238) | Cod sursa (job #1312218) | Cod sursa (job #527749)
Cod sursa(job #527749)
#include<iostream.h>
#include<fstream.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];
long i,j;
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];}
int isNumber(char ci[N])
{long i;
for(i=0;i<strlen(ci);i++)
if(ci[i]<'0'||ci[i]>'9')
return 0;
return 1;}
long eval(char postf[N])
{stiva q;
char *ci;
long i=0,t1,t2;
q.n=0;
ci=strtok(postf," ");
while(ci!=NULL)
{if(isNumber(ci)==1)
add(q,atol(ci));
else
{if(*ci=='+')
{t2=del(q);
t1=del(q);
add(q,t1+t2);}
else
if(*ci=='-')
{t2=del(q);
t1=del(q);
add(q,t1-t2);}
else
if(*ci=='*')
{t2=del(q);
t1=del(q);
add(q,t1*t2);}
else
if(*ci=='/')
{t2=del(q);
t1=del(q);
add(q,t1/t2);}}
ci=strtok(NULL," ");}
return del(q);}
int pri(char ch)
{if(ch=='(')
return 0;
else
if(ch=='+'||ch=='-')
return 1;
else
return 2;}
void topostf(char in[N],char out[N])
{stack s;
s.sp=0;
long i=0,j=0,r;
while(i<strlen(in))
{if(in[i]>='0'&&in[i]<='9')
{while(in[i]>='0'&&in[i]<='9')
out[j++]=in[i++];
i--;}
else
{out[j++]=' ';
if(in[i]=='(')
push(s,in[i]);
else
if(in[i]==')')
{while(s.sp!=0&&((r=pop(s))!='('))
{out[j++]=r;
out[j++]=' ';}}
else
{while(s.sp!=0&&pri(in[i])<=pri(top(s)))
{out[j++]=pop(s);
out[j++]=' ';}
push(s,in[i]);}}
i++;}
while(s.sp!=0)
{out[j++]=pop(s);
out[j++]=' ';}
out[j]='\0';}
int main()
{ifstream f1("evaluare.in");
ofstream f2("evaluare.out");
f1>>inf;
topostf(inf,postf);
f2<<eval(postf);
f1.close();
f2.close();
return 0;}