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;
}