#include <stdio.h>
#include <string.h>
typedef struct{char S[20][20];INT Top;} SQ;
void Copystr (char *a,char *b)
{
int i=0;
Todo
{
B[i]=a[i];
i++;
}
while (a[i]!= ' ");
B[i]= ' ";
}
void Voidsq (SQ *s)
{
s->top=-1;
}
int Ifempty (SQ *s)
{
return (S->TOP==-1);
}
Void push (SQ *s,char *c)
{
if (s->top==19)
printf ("Over flow\n");
Else
{
s->top++ ;
copystr (C,s->s[s->top]);
}
}
Char *pop (SQ *s)
{
if (Ifempty (S))
{
printf ("Over flow!\n");
return (NULL);
}
Else
return (s->s[s->top--]);
}
int judge (char *c)
{
if (c[1]== ' ")
Switch (c[0])
{
Case ' + ': return (3);
Case '-': return (3);
Case "*": return (2);
Case '/': return (2);
Default:return (1);
}
Else
return (1);
}
void Write (char *a,char *b,char *c)
{
strcat (A,C);
strcat (A,B);
}
int Seek (char *c,int start)
{
int signal=1;
for (start=start++;c[start]!= ' &&signal!=0;start++ ')
{
if (c[start]== ') ")
signal--;
else if (c[start]== ' (')
signal++;
}
if (signal==0)
return (START-1);
Else
{
printf ("Enter invalid formula \ n");
Return (-1);
}
}
void FB (SQ *a,sq *b)
{
for (;! Ifempty (A);)
{
Push (B,a->s[a->top]);
Pop (A);
}
}
Char *rewrite (char *a)
{
SQ Front;
SQ back;
int i,j,k,flag=0;
Char *result;
Char mid[20];
VOIDSQ (&front);
VOIDSQ (&back);
for (i=0; a[i]!= ';) '
{
if (a[i]== ' (')
{
J=seek (A,i);
for (k=i+1;k<j;k++)
{
MID[K-I-1]=A[K];
}
Mid[j-i-1]= ' ";
Copystr (Rewrite (mid), mid);
Push (&BACK,MID);
i=j+1;
}
else if (a[i]!= ' (')
{
Mid[0]=a[i];
Mid[1]= ' ";
Push (&BACK,MID);
i++;
}
}
FB (&back,&front);
for (;front.top>=2;)
{
flag=0;
for (i=0;i<=front.top;i++)
{
if (judge (Front.s[i]) ==2)
{
flag=1;
Break
}
}
if (flag==1)
{
for (;front.top>=2;)
{
if (judge (Front.s[front.top)) ==1&&judge (Front.s[front.top-1]) ==2&&judge (front.s[front.top-2)) = = 1)
{
Write (front.s[front.top],front.s[front.top-1],front.s[front.top-2]);
Push (&back,front.s[front.top]);
Pop (&front);
Pop (&front);
Pop (&front);
}
Else
{
Push (&back,front.s[front.top]);
Pop (&front);
}
}
FB (&front,&back);
FB (&back,&front);
}
Else
{
for (;front.top>=2;)
{
if (judge (Front.s[front.top)) ==1&&judge (Front.s[front.top-1]) ==3&&judge (front.s[front.top-2)) = = 1)
{
Write (front.s[front.top],front.s[front.top-1],front.s[front.top-2]);
Push (&back,front.s[front.top]);
Pop (&front);
Pop (&front);
Pop (&front);
}
Else
{
Push (&back,front.s[front.top]);
Pop (&front);
}
}
FB (&front,&back);
FB (&back,&front);
}
}
Result=front.s[front.top];
return (result);
}
typedef struct{char C[20];INT Top;} Sq
int execute (char a,char b,char c)
{
Switch (a)
{
Case (' + '): Return ((c-48) + (b-48));
Case (' – '): Return ((c-48)-(b-48));
Case (' * '): Return ((c-48) * (b-48));
Case ('/'): Return ((c-48)/(b-48));
}
}
void voidsq (Sq *s)
{
s->top=-1;
}
int ifsqempty (sq *s)
{
return (S->TOP==-1);
}
void pushsq (sq *s,char x)
{
if (s->top==19)
printf ("Over flow!\n");
Else
{
s->top=s->top+1;
s->c[s->top]=x;
}
}
void popsq (Sq *s)
{
if (Ifsqempty (s))
printf ("Over flow!\n");
Else
s->top--;
}
int just (char c)
{
Switch (c)
{
Case (' + '): return (0);
Case (' – '): return (0);
Case (' * '): return (0);
Case ('/'): return (0);
Default:return (1);
}
}
void Restread (sq *a,sq *b)
{
for (;! Ifsqempty (a);)
{
PUSHSQ (B,a->c[a->top]);
POPSQ (a);
}
}
int calculate (char *c)
{
Sq Rest,read;
int i,re;
VOIDSQ (&rest);
VOIDSQ (&read);
for (i=0;c[i]!= ' n '; i++)
PUSHSQ (&read,c[i]);
for (;read.top>=2;)
{
for (;read.top>=2;)
{
if (Just (Read.c[read.top]) ==0&&just (read.c[read.top-1]) ==1&&just (read.c[read.top-2)) ==1)
{
Re=execute (Read.c[read.top],read.c[read.top-1],read.c[read.top-2]);
PUSHSQ (&rest,re+48);
POPSQ (&read);
POPSQ (&read);
POPSQ (&read);
}
Else
{
PUSHSQ (&rest,read.c[read.top]);
POPSQ (&read);
}
}
Restread (&read,&rest);
Restread (&rest,&read);
}
return (READ.C[0]-48);
}
void Main ()
{
Char re[20];
Char a[20];
printf ("Please input formula: \ n");
scanf ("%s", a);
Copystr (Rewrite (a), re);
printf ("Reverse-Polish: \n%s\n", re);
printf ("Evaluation result: \n%d\n", calculate (re));
}