Skip to content

Instantly share code, notes, and snippets.

@jofese
Created November 13, 2014 04:55
Show Gist options
  • Select an option

  • Save jofese/0de85524c6188f726152 to your computer and use it in GitHub Desktop.

Select an option

Save jofese/0de85524c6188f726152 to your computer and use it in GitHub Desktop.
conversion de expresiones matematicas en notacion infija a notacion postfija
/*
Name: Convertir expresion matematica en notacion infija a postfija
Author: Joel Fernandez
Date: 16/11/12 20:29
Description: expresion matematica en notacion infija y la transforma a postfija
web: http://codebotic.blogspot.com
Compartido para casicodigo.blogspot.com
*/
#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<string.h>
#define max 50
using namespace std;
struct nodo { //ESTRUCTURA DE LA PILA
char palabra;
struct nodo *sgte;
};
typedef struct nodo *Ptrpila; //definimos estructura tipo pila
typedef struct nodo *Tlista; //definimos estructura tipo lista
void push(Ptrpila &,char);
char pop(Ptrpila &);
void agregar_atras(Tlista &,char);
void destruir(Ptrpila &);
int prioridad_infija(char );
int prioridad_pila(char );
void imprimir( Tlista &);
void balanceoSimbolos( Ptrpila &, char []);
/* Funcion Principal
-----------------------------------------------------*/
int main(void)
{ Ptrpila p=NULL;
Ptrpila M=NULL;
Tlista lista=NULL;
char cad[max], c,x;
int tam;
system("color 0b");
cout<<"CONVERSION DE EXPRESIONES MATEMATICAS DE INFIJA A POSTFIJA\n\n";
do{
cout<<"INGRESE EXPRESION:";
gets(cad);
if(M!=NULL)
destruir(M);
balanceoSimbolos(M,cad); //verificamos si los simbolos de agrupacion estan
}while(M!=NULL); //correctamente valanceados
tam=strlen(cad);
for(int i=0;i<tam;i++)
{
if((cad[i]>=49&&cad[i]<=57)||(cad[i]>=97&&cad[i]<=122))//validado para numeros de 1-9 y letras
agregar_atras(lista,cad[i]);
if(cad[i]=='+'||cad[i]=='-'||cad[i]=='*'||cad[i]=='/'||cad[i]=='('||cad[i]=='^')
{ if(p==NULL)
push(p,cad[i]);
else
{
if(prioridad_infija(cad[i])>prioridad_pila(p->palabra))//compara prioridad de operadores
push(p,cad[i]);
else
{ if(prioridad_infija(cad[i])==prioridad_pila(p->palabra))
{
c=pop(p);
agregar_atras(lista,c);
push(p,cad[i]);
}
else
{
c=pop(p);
agregar_atras(lista,c);
}
}
}
}
if(cad[i]==')')
{
while(p->palabra!='('&&p!=NULL)//desempilamos y agregamos a lista
{
c=pop(p);
agregar_atras(lista,c);
}
if(p->palabra=='(')
c=pop(p);
}
}
while(p!=NULL)//si es que la pila aun no esta nula pasamos los operadores a lista
{
c=pop(p);
agregar_atras(lista,c);
}
imprimir(lista);
system("pause");
return 0;
}
/* Apilar
-------------------------------------------------*/
void push(Ptrpila &p,char a)
{
Ptrpila q=new struct nodo;
q->palabra=a;
q->sgte=p;
p=q;
}
/* Desempilar
-------------------------------------------------*/
char pop(Ptrpila &p)
{
int n;
Ptrpila aux;
n=p->palabra;
aux=p;
p=p->sgte;
delete(aux);
return n;
}
/* Agregar a la Lista
--------------------------------------------------
funcion para agregar caracter a la lista de salida*/
void agregar_atras(Tlista &lista,char a)
{
Tlista t, q = new(struct nodo);
q->palabra = a;
q->sgte = NULL;
if(lista==NULL)
{
lista = q;
}
else
{
t = lista;
while(t->sgte!=NULL)
{
t = t->sgte;
}
t->sgte = q;
}
}
/* Destruir Pila
--------------------------------------------------*/
void destruir(Ptrpila &M)
{ Ptrpila aux;
if(M !=NULL)
{
while(M!=NULL)
{
aux=M;
M=M->sgte;
delete(aux);
}
}
}
/* Prioridad en Notacion Infija
----------------------------------------------------
esta prioridad se usa al momento de leer el caracter
de la cadena*/
int prioridad_infija(char a)
{
if(a=='^')
return 4;
if( a=='*')
return 2;
if( a=='/')
return 2;
if( a=='+')
return 1;
if( a=='-')
return 1;
if(a=='(')
return 5;
}
/* Prioridad en Pila
---------------------------------------------------
esta prioridad es usada para los elementos que se
encuentran en la pila */
int prioridad_pila(char a)
{
if(a=='^')
return 3;
if( a=='*')
return 2;
if( a=='/')
return 2;
if( a=='+')
return 1;
if( a=='-')
return 1;
if(a=='(')
return 0;
}
/* Imprimir Lista
----------------------------------------------------*/
void imprimir( Tlista &lista)
{
Ptrpila aux;
aux=lista;
if(lista!=NULL)
{ cout<<"\t\nNOTACION POSTFIJA\n\n";
while(aux!=NULL)
{ cout<<aux->palabra;
aux = aux->sgte;
}
}
cout<<endl<<endl;
}
/* Balanceo de simbolos de agrupacion
---------------------------------------------------------------------*/
void balanceoSimbolos( Ptrpila &p, char cad[])
{
Ptrpila aux;
int i = 0;
while( cad[i] != '\0')
{
if( cad[i]=='(' || cad[i]=='[' || cad[i]=='{' )
{
push( p, cad[i] );
}
else if( cad[i]==')' || cad[i]==']' || cad[i]=='}' )
{
aux = p;
if(aux!=NULL)
{
if( cad[i]==')' )
{
if( aux->palabra == '(')
pop( p );
}
else if( cad[i]==']' )
{
if( aux->palabra == '[')
pop( p );
}
else if( cad[i]=='}' )
{
if( aux->palabra == '{')
pop( p );
}
}
else
push( p, cad[i] );
}
i++;
}
if(p==NULL)
cout<<"\n\tBalanceo CORRECTO..."<<endl<<endl;
else
cout<<"\n\t Balanceo INCORRECTO, faltan simbolos de agrupacion..."<<endl;
}
@eder2320
Copy link
Copy Markdown

buen codigo

@erwing123
Copy link
Copy Markdown

Me lo puede crear un un código de converdion matematica en c++ en fonde se convierta de pos fija a infija??

@estamosenvivoverdad
Copy link
Copy Markdown

Palco! Estamos en vivo verdad!
Buen código botija

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment