Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Notación infija a postfija

Estas en el tema de Notación infija a postfija en el foro de C/C++ en Foros del Web. Hola!, tengo un código en el que me estoy basando para pasar de notación infija a posfija, y le tengo que agregar que me acepte ...
  #1 (permalink)  
Antiguo 24/12/2015, 15:35
 
Fecha de Ingreso: julio-2013
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Notación infija a postfija

Hola!, tengo un código en el que me estoy basando para pasar de notación infija a posfija, y le tengo que agregar que me acepte funciones trigonométricas y devuelva el resultado.
Tal vez sea un poco simple la pregunta pero lo que es programación me ha costado un poco y sobre todo porque tiene mucho que la ejerzo.

Bueno una de mis preguntas es:¿ para pasarla de notación infija a posfija tendría que crear tres pilas?, una donde guarde los operandos, los operadores y las funciones trigonométricas?.

El código lo dejo aquí, y una parte donde no entiendo bien que hace si me pudiesen explicar y si me pudiesen dar ideas para realizar el programa.

Gracias

Código PHP:
#include<iostream>
#include<stdlib.h>
#include<ncurses.h>
#include<math.h>
#include<iostream>
#include<fstream>


using namespace std;

class 
Pila{
private:
    
struct Elemento{
        
int dato;
        
Elemento *ant;
    }*
p;
public:
    
Pila(){
        
p=NULL;
    }
    
    
void insertar(int d){
        
Elemento *q;
        
q=new Elemento();
        
q->dato=d;
        
q->ant=p;
        
p=q;
    }
    
    
int extraer(){
        
Elemento *q;
        
int d;
        if(
p==NULL){
            
cout<<"\nPila vacia";
            return -
1;
        }
        
q=p;
        
p=q->ant;
        
d=q->dato;
        
delete q;
        return 
d;
    }
    
    
bool vacia(){// si esta vacia
        
if(p==NULL)
            return 
true;
        return 
false;
    }
    
    ~
Pila(){
        while(
p!=NULL)
            
extraer();
    }
};

bool pre(char achar b){//toma simbolos
/*
Aquí pensaba agregar las funciones trigonométricas pero como es de carácter por carácter entonces por ejemplo sen me marca un error
*/    

int p1p2;
    if(
a=='+' || a== '-')
        
p1=1;
    else if(
a=='*' || a=='/' || a=='%')
        
p1=2;
    else if(
a=='(')
        
p1=0;
    else if(
a==')')
        
p1=0;
    if(
b=='+' || b== '-')
        
p2=1;
    else if(
b=='*' || b=='/' || b=='%')
        
p2=2;
    else if(
b=='(')
        
p2=0;
    else if(
b==')')
        
p2=0;
    
    if(
p2>p1)
        return 
true;
    return 
false;
}

char *posfija(char *infija){
    
Pila p;
    
char *pos;
    
char a,b;
    
int i,jlen=-1;
    while(
infija[++len]!=0);
    
pos=new char[len+1];
    
j=0;
    for(
i=0i<leni++){
        if((
infija[i]>='0' && infija[i]<='q') || (infija[i]>='a' && infija[i]<='z')){
            
pos[j++]=infija[i];
        }
        else{
//de aquí para adelante hasta terminar la función no entiendo muy bien que hace//
            
if(p.vacia()){
                
p.insertar(infija[i]);
            }
            else{
                
a=p.extraer();
                
b=infija[i];
                if(
b==')'){
                    while(
a!='('){
                        
pos[j++]=a;
                        
/*    if(p.vacia())
                         a='(';
                         else*/
                        
a=p.extraer();
                    }
                }
                else{
                    if(
pre(a,b) || infija[i]=='('){
                        
p.insertar(a);
                        
p.insertar(b);
                    }
                    else{
                        
pos[j++]=a;
                        
p.insertar(b);
                    }
                }
            }    
        }
        
    }
    while(!
p.vacia()){
        
a=p.extraer();
        
pos[j++]=a;
    }
    
pos[j]=0;
    return 
pos;
}

int main(){
    
Pila p;//objeto p de la clase pila
    
int i;
    
char a[]="a-((a+b)*c)/d";
    
char *b;
    
b=posfija(a);
    
cout<<b;
    
//    for(i=0; i<100; i++)
    //    p.insertar(i);
    //while(!p.vacia())
    //printf("%d\t", p.extraer());
    
getchar();
    return 
0;
    

  #2 (permalink)  
Antiguo 28/12/2015, 06:51
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Notación infija a postfija

La notación posfija es (creo) lo mismo que la notación polaca inversa. En mi opinión, necesitarías solamente dos pilas, una de operandos y otra de operadores. Al igual que, por ejemplo, una suma es un operador que afectaría a los dos últimos elementos de la pila, una función como el seno o el coseno sería un operador que afecta solamente al último elemento de la pila.

Básicamente, el proceso sería:

Suma:
- Saca operando
- Saca operando
- Efectúa operación
- Mete resultado

Seno:
- Saca operando
- Calcula valor función
- Mete resultado

Etiquetas: char, funcion, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:26.