Infija a Posfija in c ++ using batteries

0

Hi, I need to do a program that converts an equation in infixed notation to a posifija notation and prints the equation in infix and posfija notation. I already reviewed it several times and made some modifications but I can not find the error, if you can help me I would appreciate it. The error must be in the posfix method of the convert_expression class.

#define TAM 255
#define VACIA -1
#include <iostream>
#include <cstring>

using namespace std;
// La clase pila ya tiene su funcionalidad completa
class pila_arre
{
   private:
      int tam;
      int tos;
      char datos[TAM];

   public:
      pila_arre()
      {
          tam =TAM;
          tos = VACIA;
      }

      bool vacia()
      {
          return tos == VACIA;
      }
      bool llena()
      {
          return tos == tam-1;
      }
      // El siguiente metodo lee el caracter que se encuentra
      // en la cima de la pila
      // Regresa '
#define TAM 255
#define VACIA -1
#include <iostream>
#include <cstring>

using namespace std;
// La clase pila ya tiene su funcionalidad completa
class pila_arre
{
   private:
      int tam;
      int tos;
      char datos[TAM];

   public:
      pila_arre()
      {
          tam =TAM;
          tos = VACIA;
      }

      bool vacia()
      {
          return tos == VACIA;
      }
      bool llena()
      {
          return tos == tam-1;
      }
      // El siguiente metodo lee el caracter que se encuentra
      // en la cima de la pila
      // Regresa '%pre%' si esta vacia
      // No modifica tos, solo lee
      char top()
      {
        char val = '%pre%'; // caracter de fin de cadena o caracter nulo
        if(!vacia())
           val = datos[tos];
        return val;

      }
      void push(char val)
      {
          if(!llena())
             datos[++tos]= val;
          else
             cout << "\nPila llena el dato " << val << " no se puede agregar" << endl;
      }
      char pop()
      {   
          char val='%pre%'; // caracter de fin de cadena o caracter nulo
          if(!vacia())
             val = datos[tos--];
          else
             cout << "\nPila vacia, no se puede eliminar" << endl;
          return val;
      }

};
class convierte_expresion
{
    public:     
        // El metodo postix recibe en ei la expresion en infix
        // y la expresion postfix convertida la deja en ep

            void postfix(char ei[], char ep[])
        {
            pila_arre pa;  // esta pila es para convertir de infix a postfix

            int i = 0,j=0;
            while(ei[i] != '%pre%')
            {
                if(ei[i] >= 'a' && ei[i] <= 'z' || ei[i]>='A' && ei[i] <= 'Z')
                {                                        
                    ep[j] = ei[i]; 
                    i++;
                    j++;
                }
                else
                    if(ei[i]=='(')
                    {
                        pa.push(ei[i]);
                        i++;
                    }
                else 
                     if(ei[i]==')')
                     {
                        while( pa.top() != '(')
                        {
                            ep[j]= pa.pop();
                            j++;
                        }
                            if(pa.top() == '(')
                               {
                                   pa.pop();
                               }
                            i++;
                    }

                    else 
                        if(ei[i]=='+' || ei[i]=='-' || ei[i]=='*' || ei[i]=='/')
                        {
                            if(ei[i]=='+' || ei[i] == '-')
                            {
                                while(!pa.vacia() && pa.top() != '(')
                                    {
                                        ep[j]=pa.pop();
                                        j++;
                                    }
                                pa.push(ei[i]);
                                i++;
                            }
                            else
                            {
                                if(ei[i]=='*' || ei[i]=='/')
                                {
                                    while(!pa.vacia() && pa.top() != '(' && (pa.top()=='*'|| pa.top()=='/'))
                                    {
                                        ep[j]=pa.pop();
                                        j++;
                                    }

                                    pa.push(ei[i]);
                                    i++;
                                }   
                           }      

                       }
                       else
                       {
                           cout<<"CARACTER INVALIDO"<<endl; 
                           ei[i] = '%pre%';
                       }

            }

            while(!pa.vacia())
            {
                ep[j]=pa.pop();
                j++;
            }
       ep[j] = '%pre%';

       }

};

int main () {

    char expresion_infix[TAM];
    char expresion_postfix[TAM];
    convierte_expresion ce;
    cout << "La expresion en infix solo debe contener:" << endl;
    cout << "1) Caracteres alfabeticos individuales entre los operadores" << endl;
    cout << "2) Operadores aritmeticos basicos: + - * /" << endl;
    cout << "3) Parentesis, pueden ser con anidamientos" << endl;
    cout << "4) Longitud maxima de la expresion: "<< TAM -1 << "\n" << endl;
    cout << "\nEscribe tu expresion en infix:" << endl;
    cin.getline (expresion_infix, TAM-1); // al leer la cadena getline() pone como ultimo caracter '%pre%'
    ce.postfix(expresion_infix, expresion_postfix);
    cout << "\n**************************************************************" << endl;
    cout << "\nLa cadena infija \n"  << expresion_infix << endl;
    cout << "\nConvertida en postfix es: \n"  << expresion_postfix << endl;
    cout << "\n**************************************************************" << endl;

    return 0;
}
' si esta vacia // No modifica tos, solo lee char top() { char val = '%pre%'; // caracter de fin de cadena o caracter nulo if(!vacia()) val = datos[tos]; return val; } void push(char val) { if(!llena()) datos[++tos]= val; else cout << "\nPila llena el dato " << val << " no se puede agregar" << endl; } char pop() { char val='%pre%'; // caracter de fin de cadena o caracter nulo if(!vacia()) val = datos[tos--]; else cout << "\nPila vacia, no se puede eliminar" << endl; return val; } }; class convierte_expresion { public: // El metodo postix recibe en ei la expresion en infix // y la expresion postfix convertida la deja en ep void postfix(char ei[], char ep[]) { pila_arre pa; // esta pila es para convertir de infix a postfix int i = 0,j=0; while(ei[i] != '%pre%') { if(ei[i] >= 'a' && ei[i] <= 'z' || ei[i]>='A' && ei[i] <= 'Z') { ep[j] = ei[i]; i++; j++; } else if(ei[i]=='(') { pa.push(ei[i]); i++; } else if(ei[i]==')') { while( pa.top() != '(') { ep[j]= pa.pop(); j++; } if(pa.top() == '(') { pa.pop(); } i++; } else if(ei[i]=='+' || ei[i]=='-' || ei[i]=='*' || ei[i]=='/') { if(ei[i]=='+' || ei[i] == '-') { while(!pa.vacia() && pa.top() != '(') { ep[j]=pa.pop(); j++; } pa.push(ei[i]); i++; } else { if(ei[i]=='*' || ei[i]=='/') { while(!pa.vacia() && pa.top() != '(' && (pa.top()=='*'|| pa.top()=='/')) { ep[j]=pa.pop(); j++; } pa.push(ei[i]); i++; } } } else { cout<<"CARACTER INVALIDO"<<endl; ei[i] = '%pre%'; } } while(!pa.vacia()) { ep[j]=pa.pop(); j++; } ep[j] = '%pre%'; } }; int main () { char expresion_infix[TAM]; char expresion_postfix[TAM]; convierte_expresion ce; cout << "La expresion en infix solo debe contener:" << endl; cout << "1) Caracteres alfabeticos individuales entre los operadores" << endl; cout << "2) Operadores aritmeticos basicos: + - * /" << endl; cout << "3) Parentesis, pueden ser con anidamientos" << endl; cout << "4) Longitud maxima de la expresion: "<< TAM -1 << "\n" << endl; cout << "\nEscribe tu expresion en infix:" << endl; cin.getline (expresion_infix, TAM-1); // al leer la cadena getline() pone como ultimo caracter '%pre%' ce.postfix(expresion_infix, expresion_postfix); cout << "\n**************************************************************" << endl; cout << "\nLa cadena infija \n" << expresion_infix << endl; cout << "\nConvertida en postfix es: \n" << expresion_postfix << endl; cout << "\n**************************************************************" << endl; return 0; }
    
asked by Esteban 16.05.2018 в 05:01
source

0 answers