You are on page 1of 3

#include <stdio.

h> {
#include <math.h> pilaoprs pila2;
#include <conio.h> char x,*aux=expp;
#include <stdlib.h> pila2.tope=VACIA;
#include <iostream.h> int y=0,r=0;
#include <string.h>
while(*expi)
const MAX=100, VACIA=-1; {
x=pila2.tope;
struct pilaopds if(*expi=='(')
{ {
int tope; expi++;
float elem[MAX]; while(*expi!=')')
}; { if(esoperando(*expi))
*expp++=*expi++;
struct pilaoprs else
{ {
int tope;
char elem[MAX]; while((pila2.tope>r||!vacia2(&pila2))&&
}; precedencia(x=pop2(&pila2), *expi))

float EvalPosf(char*); {*expp++=x;y=1;}


int esoperando(char);
void push1(pilaopds*, float); if(esoperador(x)&&(y==0||!precedencia(x,*expi)))
float pop1(pilaopds*);
int vacia1(pilaopds*); push2(&pila2,x);
float operacion(char, float, float);
char *ConviertePosf(char*,char*); push2(&pila2,*expi);
void push2(pilaoprs*,char); expi++;
char pop2(pilaoprs*); }
int vacia2(pilaoprs*); y=0;
int precedencia(char,char); }
int esoperador(char); expi++;
void main() while(pila2.tope>=r)
{ *expp++=pop2(&pila2);
char exp[MAX],exp1[MAX];

clrscr(); }
cout<<"Introduce una expresion infija:\n"; if(esoperando(*expi))
gets(exp); *expp++=*expi++;
puts(ConviertePosf(exp,exp1)); else
cout<<"\nTu resultado {
fue:\n"<<EvalPosf(exp1);
getch(); while(!vacia2(&pila2) &&
precedencia(x=pop2(&pila2), *expi))
}
{*expp++=x;y=1;}
char *ConviertePosf(char *expi, char *expp)
if(esoperador(x)&&(y==0||!precedencia(x,*expi))) int vacia2(pilaoprs *p)
{
push2(&pila2,x); return (p->tope)==-1;
}
push2(&pila2,*expi); int precedencia(char x,char y){
expi++; int uno=0,dos=0;
} switch(x)
y=0; {
} case '+':
while(!vacia2(&pila2)) uno=1;
*expp++=pop2(&pila2); break;
*expp=NULL; case '-':
uno=1;
return aux; break;
} case '*':
int esoperador(char x) uno=2;
{ break;
return x=='+'||x=='-'||x=='*'||x=='/'||x=='$'; case '/':
} uno=2;
void push2(pilaoprs *p, char x) break;
{ case '$':
if(p->tope == MAX-1) uno=3;
{ break;
cout<<"Desborde en la pila de }
operadores..."; switch(y)
getch(); {
exit(1); case '+':
} dos=1;
break;
p->elem[++(p->tope)]=x; case '-':
dos=1;
return; break;
} case '*':
dos=2;
char pop2(pilaoprs *p) break;
{ case '/':
if(vacia2(p)) dos=2;
{ break;
cout<<"Subdesborde en la pila de case '$':
operadores..."; dos=3;
getch(); break;
exit(1); }
}
if(uno>=dos)
return p->elem[(p->tope)--]; return 1;
else
} return 0;
} if(p->tope == MAX-1)
{
cout<<"Desborde en la pila de
operandos...";
getch();
float EvalPosf(char *exp) exit(1);
{ }
float opr1,opr2;
pilaopds pila1; p->elem[++(p->tope)]=x;

pila1.tope=-1; return;
}
while(*exp)
{ float pop1(pilaopds *p)
if(esoperando(*exp)) {
push1(&pila1, float(*exp- if(vacia1(p))
'0')); {
else cout<<"Subdesborde en la pila de
{ operandos...";
opr2 = pop1(&pila1); getch();
opr1 = pop1(&pila1); exit(1);
push1(&pila1, }
operacion(*exp, opr1, opr2));
} return p->elem[(p->tope)--];
}
exp++;
} int vacia1(pilaopds *p)
{
opr1 = pop1(&pila1); return (p->tope)==-1;
}
if(!vacia1(&pila1))
{ float operacion(char a, float x, float y)
cout<<"Error de sintaxis en la {
expresion posfija..."; switch(a)
getch(); {
exit(1); case '+':return x+y;
} case '-':return x-y;
case '*':return x*y;
return opr1; case '/':return x/y;
} case '$':return pow(x,y);
default: cout<<"Operacion no
int esoperando(char x) permitida...";
{ getch();
return x>='0' && x<='9'; exit(1);
} }
return 0;
void push1(pilaopds *p, float x) }
{

You might also like