Ayuda con Pilas

Necesito pasar una expresión infija a prefija y mostrar el resultado, ocupo el código por favorrrr, no se como hacerlo, Gracias.
1

1 respuesta

Respuesta
1
De primeras, he encontrado esto por la web, no es exactamente la conversion q tu quieres, pero tiene q estar cerca:
http://www.programacion.com/foros/29/msg/107944/
Ahora te doy el procedimiento, para pasar de infija a prefija:
http://articulos.conclase.net/calculadora/simple.html
Y este codigo NO probado:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
#include<math.h>
#define MAX 30
char pre[MAX],inf[MAX];
void leer_expresion();
int validar();
int prece(char c);
void invierte(char cad[MAX]);
void prefija();
void evalua();
int operacion(int n1,int n2,char c);
int digito(char c);
int numero(char c);
int er;
void main()
{
char opc='S';
while(opc=='S')
{
leer_expresion();
if(validar()==1)
{
prefija();
evalua();
}
gotoxy(5,22);printf("Realizar otra conversi¢n [S/N]");
do{opc=toupper(getch());}while((opc!='S')&&(opc!='N'));
}
}
void leer_expresion()
{
do
{
fflush(stdin);
clrscr();
gotoxy(20,3);printf("CONVERSION DE NOTACION INFIJA A PREFIJA\n\n");
gotoxy(5,5);printf("1.- Solo se permiten las siguientes operaciones y operadores:");
gotoxy(15,7);printf("Parentesis ( )");
gotoxy(15,8);printf("Exponenciaci¢n &");
gotoxy(15,9);printf("Multiplicaci¢n *");
gotoxy(15,10);printf("Divisi¢n /");
gotoxy(15,11);printf("Suma +");
gotoxy(15,12);printf("Resta -");
gotoxy(5,14);printf("2.- Solo se permiten n£meros como operandos");
gotoxy(5,16);printf("Escriba una expresi¢n en notaci¢n infija: ");
gets(inf);
}while((strlen(inf)>=MAX)||strlen(inf)==0);
}
int validar()
{
int par=0,l=0,o=0,e=0;
char *ver;
for(ver=inf;*ver!=NULL;ver++)
{
if(*ver==')'&&par==0) e=1;
else
{
if(*ver=='(') par++;
else if(*ver==')') par--;
}
if(*ver=='$'||*ver=='*'||*ver=='/'||*ver=='+'||*ver=='-')
{
if(o==l) e=1;
else o++;
}
else if((*ver>='0'&&*ver<='9'))
{
if(l>o) e=1;
else l++;
}
else if(*ver!='('&&*ver!=')') e=1;
if(*ver=='(')
{
if(ver!=inf)
{
ver--;
if(*ver!='$'&&*ver!='*'&&*ver!='/'&&*ver!='+'&&*ver!='-'&&*ver!='(')
e=1;
ver++;
}
ver++;
if((*ver<'0'||*ver>'9')&&*ver!='(')
e=1;
ver--;
}
if(*ver==')')
{
ver++;
if(*ver!='$'&&*ver!='*'&&*ver!='/'&&*ver!='+'&&*ver!='-'&&*ver!=')'&&*ver!=NULL)
e=1;
ver--;
}
}
if(par!=0||e==1||l==o)
{gotoxy(5,18);printf("Expresi¢n incorrecta");return 0;}
return 1;
}
int prece(char c)
{
int p;
switch(c)
{
case '$':p=1;
break;
case '*':p=2;
break;
case '/':p=2;
break;
case '+':p=3;
break;
case '-':p=3;
break;
}
return p;
}
void invierte(char cad[MAX])
{
int i,n;
char aux;
n=strlen(cad)/2;
for(i=0;i<=n*2;i++)
if(cad=='(')
cad=')';
else if(cad==')')
cad='(';
for(i=0;i<n;i++)
{
aux=cad;
cad=cad[n*2-i];
cad[n*2-i]=aux;
}
}
void prefija()
{
char *ver,*aux;
int cont=0,p=0,i,pr=0;
for(i=0;i<MAX;i++)pre='\0';i=0;
invierte(inf);
for(ver=inf;*ver!='\0';ver++)
{
if((*ver>='0'&&*ver<='9'))
pre[i++]=*ver;
else if(*ver=='$'||*ver=='*'||*ver=='/'||*ver=='+'||*ver=='-')
{
if(cont==0||*(aux-1)=='(')
{
*aux=*ver;
aux++;
cont++;
*aux='\0';
}
else if(cont!=0)
{
if(((prece(*(aux-1))==1)&&prece(*(aux-1))==prece(*ver))
|| (prece(*ver)>prece(*(aux-1))) )
{
aux--;
pre[i++]=*aux;
if(pr!=0&&p==0)
while(pr>0)
{
if((prece(*ver)==prece(*aux)&&prece(*ver)==1)||(prece(*ver)<prece(*(aux-1)))||(prece(*(aux-1))==prece(*ver)))break;
aux--;
pre[i++]=*aux;
cont--;
pr--;
}
*aux=*ver;
aux++;
*aux='\0';
}
else if((prece(*ver)<prece(*(aux-1)))||(prece(*ver)==2&&prece(*(aux-1))==2)||(prece(*ver)==3&&prece(*(aux-1))==3))
{
*aux=*ver;
aux++;
*aux='\0';
cont++;
pr++;
}
}
}
else if(*ver=='(')
{
*aux=*ver;
aux++;
*aux='\0';
p++;
}
else if(*ver==')')
{
p--;
aux--;
while(*aux!='(')
{
pre[i++]=*aux;
cont--;
aux--;
}
*aux='\0';
}
}
if(cont!=0)
for(cont;cont>0;cont--)
{
aux--;
pre[i++]=*aux;
pre='\0';
}
invierte(pre);
gotoxy(5,18);printf("Notaci¢n prefija: %s",pre);
}
void evalua()
{
int aux[MAX/2],i,co=0,n1,n2,n;
er=0;n=strlen(pre);
for(i=n-1;i>=0;i--)
{
if(digito(pre))
aux[co++]=numero(pre);
else
{
n1=aux[--co];
n2=aux[--co];
aux[co++]=operacion(n1,n2,pre);
}
}
gotoxy(5,20);
if(er==1)
printf("ERROR Divisi¢n entre 0");
else
printf("La evaluaci¢n es: %d",aux[0]);
}
int operacion(int n1,int n2,char c)
{
int r=0;
switch(c)
{
case '$':r=pow(n1,n2);
break;
case '*':r=n1*n2;
break;
case '/':if(n2==0)
{
er=1;
}
else
r=n1/n2;
break;
case '+':r=n1+n2;
break;
case '-':r=n1-n2;
break;
}
return r;
}
int digito(char c)
{
if(c>='0'&&c<='9')
return 1;
else
return 0;
}
int numero(char c)
{
int num;
char dig[2];
dig[0]=c;
dig[1]='\0';
num=atoi(dig);
return num;
}

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas