infijo-postfijo
Hola! Soy novata y necesito un programa que covierta uns expresion infija a postfija mediante pilas. Se agradece la atencion prestada!
Hola! Soy novata y necesito un programa que covierta uns expresion infija a postfija mediante pilas. Se agradece la atencion prestada!
#include <stdio.h> // programa hecho por FELIPE ROMERO PEDREROS
#include <conio.h>
#include <alloc.h> // en dev++ es malloc y alloc es para usar "std"
#include <string.h>
#define TAM 7 //tamaño de arreglo
#define TRUE 1
#define FALSE 0
typedef char TipoP;
typedef struct { // Declaracion de estructura
TipoP info[TAM];
int tope;
}TPila;
TPila *InicPila( ) // iniciacion de la Pila
{ TPila *p = (TPila *) malloc (sizeof(TPila));
p->tope = 0; /*Se tiene una pila vacía*/
return(p);
}
int VaciaPila(TPila *p) // funciones de las pilas
{ if (p->tope == 0) return(TRUE);
else return(FALSE);
}
int LlenaPila(TPila *p)
{ if (p->tope == TAM) return TRUE;
else return FALSE;
}
void AdicPila(TPila *p, TipoP dato)
{ if (LlenaPila(p))
printf("Error, Pila Llenan");
else {
p->info[p->tope] = dato;
p->tope++;
}
}
void ElimPila(TPila *p)
{ if (VaciaPila(p))
printf ("Error, Pila Vacían");
else
p->tope--; /*Elimina el elemento del tope*/
}
TipoP InfoPila(TPila *p)
{ if (VaciaPila(p))
{ printf ("Error, Pila Vacían");
return(0);}
else
return(p->info[p->tope-1]);
}
void DestruirPila(TPila *p)
{ free(p);
}
int verifica(char arreglo[TAM],int i) // funcion para compara caracteres
{ if (arreglo[i]=='/' || arreglo[i]=='*' || arreglo[i]=='+' || arreglo[i]=='-')
return(TRUE);
else
return(FALSE);
}
void posorden(TPila *p,TPila *p2,char arreglo[TAM]) // funcion hace el cambio
{
int i=0,j=0,k;
do{
if(verifica(arreglo,i)==0) // pasa los numeros
{AdicPila(p,arreglo[i]);
i++;
}
if(verifica(arreglo,i)==1) // pasa los caracteres
{
do{
for(k=0;k<j*2+1;k++) // paso caracter 1 a pila 2 y elimino caracter pila 1
{AdicPila(p2,InfoPila(p));
ElimPila(p);
}
if(j>=1) // condicion cuando los operadores sean mas de 1 y no se produsca un error de paso parametro y qeden dos operedores juntos
{ if(InfoPila(p)=='-' || InfoPila(p)=='+' || InfoPila(p)=='/' || InfoPila(p)=='*' )
if(InfoPila(p2)=='-' || InfoPila(p2)=='+' || InfoPila(p2)=='/' || InfoPila(p2)=='*')
for(k=0;k<2;k++)
{AdicPila(p2,InfoPila(p));
ElimPila(p);
}
else // si no es operador el ultimo de pila1 se pasa
{AdicPila(p2,InfoPila(p));
ElimPila(p);
}
}
AdicPila(p,arreglo[i]); // se agrega a la pila el operador del arreglo
do{ // se pasan todos los datos de pila2 a pila1
AdicPila(p,InfoPila(p2));
ElimPila(p2);
}while(VaciaPila(p2)==0);
i++; j++; // contador para aumentar el arreglo y contador de operadores
}while(verifica(arreglo,i)==1); // continua mientras el areglo sgiente sea operador
j=0;} // se pone en 0 el contador de j porke viene una variable de numero
}while(i<TAM); // termina todo el procedimiento
}
int main()
{ int i;
char arreglo[TAM]={'A','B','/','C','D','*','/'}; //se ingresa los valores
TPila *pp,*pp2; // inicializan las pilas
pp = InicPila();
pp2 = InicPila();
posorden(pp,pp2,arreglo); // funcion hace cambio
for(i=0;i<TAM;i++) // imprime arreglo
printf("%c ",arreglo[i]);
printf("n");
do{ //se da vuelta la pila
AdicPila(pp2,InfoPila(pp));
ElimPila(pp);
}while(VaciaPila(pp)==0);
for(i=0;i<TAM;i++) // imprime la pila
{
printf(" %c",InfoPila(pp2));
ElimPila(pp2);
}
getchar(); // un espacio antes de cerrar
}
#include <conio.h>
#include <alloc.h> // en dev++ es malloc y alloc es para usar "std"
#include <string.h>
#define TAM 7 //tamaño de arreglo
#define TRUE 1
#define FALSE 0
typedef char TipoP;
typedef struct { // Declaracion de estructura
TipoP info[TAM];
int tope;
}TPila;
TPila *InicPila( ) // iniciacion de la Pila
{ TPila *p = (TPila *) malloc (sizeof(TPila));
p->tope = 0; /*Se tiene una pila vacía*/
return(p);
}
int VaciaPila(TPila *p) // funciones de las pilas
{ if (p->tope == 0) return(TRUE);
else return(FALSE);
}
int LlenaPila(TPila *p)
{ if (p->tope == TAM) return TRUE;
else return FALSE;
}
void AdicPila(TPila *p, TipoP dato)
{ if (LlenaPila(p))
printf("Error, Pila Llenan");
else {
p->info[p->tope] = dato;
p->tope++;
}
}
void ElimPila(TPila *p)
{ if (VaciaPila(p))
printf ("Error, Pila Vacían");
else
p->tope--; /*Elimina el elemento del tope*/
}
TipoP InfoPila(TPila *p)
{ if (VaciaPila(p))
{ printf ("Error, Pila Vacían");
return(0);}
else
return(p->info[p->tope-1]);
}
void DestruirPila(TPila *p)
{ free(p);
}
int verifica(char arreglo[TAM],int i) // funcion para compara caracteres
{ if (arreglo[i]=='/' || arreglo[i]=='*' || arreglo[i]=='+' || arreglo[i]=='-')
return(TRUE);
else
return(FALSE);
}
void posorden(TPila *p,TPila *p2,char arreglo[TAM]) // funcion hace el cambio
{
int i=0,j=0,k;
do{
if(verifica(arreglo,i)==0) // pasa los numeros
{AdicPila(p,arreglo[i]);
i++;
}
if(verifica(arreglo,i)==1) // pasa los caracteres
{
do{
for(k=0;k<j*2+1;k++) // paso caracter 1 a pila 2 y elimino caracter pila 1
{AdicPila(p2,InfoPila(p));
ElimPila(p);
}
if(j>=1) // condicion cuando los operadores sean mas de 1 y no se produsca un error de paso parametro y qeden dos operedores juntos
{ if(InfoPila(p)=='-' || InfoPila(p)=='+' || InfoPila(p)=='/' || InfoPila(p)=='*' )
if(InfoPila(p2)=='-' || InfoPila(p2)=='+' || InfoPila(p2)=='/' || InfoPila(p2)=='*')
for(k=0;k<2;k++)
{AdicPila(p2,InfoPila(p));
ElimPila(p);
}
else // si no es operador el ultimo de pila1 se pasa
{AdicPila(p2,InfoPila(p));
ElimPila(p);
}
}
AdicPila(p,arreglo[i]); // se agrega a la pila el operador del arreglo
do{ // se pasan todos los datos de pila2 a pila1
AdicPila(p,InfoPila(p2));
ElimPila(p2);
}while(VaciaPila(p2)==0);
i++; j++; // contador para aumentar el arreglo y contador de operadores
}while(verifica(arreglo,i)==1); // continua mientras el areglo sgiente sea operador
j=0;} // se pone en 0 el contador de j porke viene una variable de numero
}while(i<TAM); // termina todo el procedimiento
}
int main()
{ int i;
char arreglo[TAM]={'A','B','/','C','D','*','/'}; //se ingresa los valores
TPila *pp,*pp2; // inicializan las pilas
pp = InicPila();
pp2 = InicPila();
posorden(pp,pp2,arreglo); // funcion hace cambio
for(i=0;i<TAM;i++) // imprime arreglo
printf("%c ",arreglo[i]);
printf("n");
do{ //se da vuelta la pila
AdicPila(pp2,InfoPila(pp));
ElimPila(pp);
}while(VaciaPila(pp)==0);
for(i=0;i<TAM;i++) // imprime la pila
{
printf(" %c",InfoPila(pp2));
ElimPila(pp2);
}
getchar(); // un espacio antes de cerrar
}
/*clase que convierte una ecuacion infija a una postfija, para proyecto de una
calculadora cientifica, creada viernes 23 de septiembre del 2005, para entregarse
el lunes 26 de septiembre. &&Stradivarius productions&& */
class inf_Posf{
Pila ePos; // ecuacion posfija
private Pila pila=new Pila(10);// crear pila de n numeros que tendra la calculadora
Pila pilaAux;
private int tope;// es un tope
private String eI;//ecuacion infija
char simbolo;// se le asignada un caracter del String
private int prioridad;
public int prioridad(int operador){
switch(operador){
case \\\\'*\\\\' : prioridad=5;break;
case \\\\'/\\\\' : prioridad=5;break;
case \\\\'+\\\\' : prioridad=1;break;
case \\\\'-\\\\' : prioridad=1;break;
case \\\\'^\\\\' : prioridad=10;break;
}
return prioridad;
}
public void convertir(String eI){
this.eI=eI;
int tomaChars=0;
while(eI!=null){
simbolo=eI.charAt(tomaChars);//le asigno a char un caracter del String Ei
tomaChars++;
if(simbolo==\\\\'(\\\\'){
pila.insertar(simbolo);
}
else{
if(simbolo==\\\\')\\\\'){
while(pila.mostrarT()!=\\\\'(\\\\'){
pila.eliminar();
ePos=new Pila(pila.t);
ePos.insertar(pila.mostrarT());
}
pila.eliminar();
}else{
if(simbolo!=\\\\'*\\\\'&& simbolo!= \\\\'-\\\\' && simbolo!= \\\\'+\\\\' && simbolo !=\\\\'/\\\\' && simbolo != \\\\'^\\\\'){
ePos.insertar(simbolo);
}else{
while(pila.mostrarVacia()==false && prioridad(simbolo)<=prioridad(pila.mostrarT())){
pila.eliminar();
ePos.insertar(pila.mostrarT());
}
}
}
}
}
while(pila.mostrarVacia()==false){
pila.eliminar();
ePos.insertar(pila.mostrarT());
}
while(ePos.mostrarVacia()==false){
System.out.println(\\\"ecuacion pos fija es=\\\"+ePos.mostrarT());
ePos.eliminar();
}
}// Metodo
}//clase
ahi tengo esa madre pero no se porque no correo bien checalo a lo mejor tu sabes porque
calculadora cientifica, creada viernes 23 de septiembre del 2005, para entregarse
el lunes 26 de septiembre. &&Stradivarius productions&& */
class inf_Posf{
Pila ePos; // ecuacion posfija
private Pila pila=new Pila(10);// crear pila de n numeros que tendra la calculadora
Pila pilaAux;
private int tope;// es un tope
private String eI;//ecuacion infija
char simbolo;// se le asignada un caracter del String
private int prioridad;
public int prioridad(int operador){
switch(operador){
case \\\\'*\\\\' : prioridad=5;break;
case \\\\'/\\\\' : prioridad=5;break;
case \\\\'+\\\\' : prioridad=1;break;
case \\\\'-\\\\' : prioridad=1;break;
case \\\\'^\\\\' : prioridad=10;break;
}
return prioridad;
}
public void convertir(String eI){
this.eI=eI;
int tomaChars=0;
while(eI!=null){
simbolo=eI.charAt(tomaChars);//le asigno a char un caracter del String Ei
tomaChars++;
if(simbolo==\\\\'(\\\\'){
pila.insertar(simbolo);
}
else{
if(simbolo==\\\\')\\\\'){
while(pila.mostrarT()!=\\\\'(\\\\'){
pila.eliminar();
ePos=new Pila(pila.t);
ePos.insertar(pila.mostrarT());
}
pila.eliminar();
}else{
if(simbolo!=\\\\'*\\\\'&& simbolo!= \\\\'-\\\\' && simbolo!= \\\\'+\\\\' && simbolo !=\\\\'/\\\\' && simbolo != \\\\'^\\\\'){
ePos.insertar(simbolo);
}else{
while(pila.mostrarVacia()==false && prioridad(simbolo)<=prioridad(pila.mostrarT())){
pila.eliminar();
ePos.insertar(pila.mostrarT());
}
}
}
}
}
while(pila.mostrarVacia()==false){
pila.eliminar();
ePos.insertar(pila.mostrarT());
}
while(ePos.mostrarVacia()==false){
System.out.println(\\\"ecuacion pos fija es=\\\"+ePos.mostrarT());
ePos.eliminar();
}
}// Metodo
}//clase
ahi tengo esa madre pero no se porque no correo bien checalo a lo mejor tu sabes porque