Código para evaluar de Infija a Postfija en C++

Podremos ingresas una ecuación en Infija y podremos convertir a Postfija para poder resolverlo y mostrar el resultado, este código esta en C++, probado en el IDE DEVC++

#include <iostream>
#include <cmath>

using namespace std;

template <class TIPO>
class Pila{
private:
	class Nodo{
	public:
		TIPO dato;
		Nodo *siguiente;	
	};
	
	Nodo *cima;
public:
	Pila();
	~Pila();
	void Apilar(TIPO dato);
	void Desapilar();
	void Mostrar();
	TIPO VerCima();
	bool Vacia();
};
template <class TIPO>
Pila<TIPO>::Pila()
{
    cima = NULL;
}
template <class TIPO>
void Pila<TIPO>:: Apilar(TIPO dato){
	Nodo *nuevo;
	nuevo= new Nodo();
	nuevo->dato=dato;
	if(cima==NULL)  
	{
		cima=nuevo;
		cima->siguiente=NULL;
	}
	else
	{
		nuevo->siguiente=cima;
		cima=nuevo;
	}
}

template <class TIPO>
void Pila<TIPO>:: Desapilar(){
 		Nodo *p_aux;
 		p_aux = cima; 
 		if(p_aux==NULL || p_aux->siguiente==NULL){
 			cima=NULL;
 		}
 		else
 			cima = p_aux->siguiente;
 		delete p_aux; 
}

template <class TIPO>
void Pila<TIPO>::Mostrar(){
	Nodo *recorrer=cima;
	cout<<"---Lista de los Nodos--"<<endl;
	while(recorrer!=NULL){
		cout<<recorrer->dato;
		recorrer=recorrer->siguiente;
	}
	cout<<endl;
	cout<<"------------------"<<endl;
	
}
template <class TIPO>
TIPO Pila<TIPO>::VerCima(){
	return cima->dato;
}
template <class TIPO>
bool Pila<TIPO>::Vacia()
{
	return cima==NULL;
}
int prioridad(char op) {
 switch (op) {
  case '^': return 3;
  case '*':
  case '/': return 2;
  case '+': 
  case '-': return 1;
  case ')': return -1;
  default: return 0;
 }
} 

template <class TIPO>
Pila<TIPO>::~Pila()
{
    Nodo *recorrido = cima;
    Nodo *bor;
    while (recorrido != NULL)
    {
        bor = recorrido;
        recorrido = recorrido->siguiente;
        delete bor;
    }
}

string convertir(string operacion){
	Pila<char> *pila1;
	string txtMat=operacion;
	string posfija="";
	for(int i=0; i<txtMat.length();i++)
	{
		if(txtMat[i]=='(')
		{
			pila1->Apilar(txtMat[i]);
		}
		else if(isdigit(txtMat[i]))
		{
			posfija+=txtMat[i];
		}
		else if(txtMat[i]==')') {
			while(!pila1->Vacia() && pila1->VerCima()!='(' )
			{
				posfija+=pila1->VerCima();
				pila1->Desapilar();
			}
			pila1->Desapilar();
		}
		else if(txtMat[i]=='+' || txtMat[i]=='-' || txtMat[i]=='*' || txtMat[i]=='/' || txtMat[i]=='^')
		{
			while (!pila1->Vacia() && prioridad(txtMat[i]) <= prioridad(pila1->VerCima()) )
			{
    		 posfija+=pila1->VerCima();
    		 pila1->Desapilar();
			}
			pila1->Apilar(txtMat[i]);
		
		}
	}

	while(!pila1->Vacia())
		{
			posfija+=pila1->VerCima();
			pila1->Desapilar();
		}

	return posfija;
}

void resolverPosfija(string pPosfija){
	Pila<double> *pilaResul;
	string txtPosfija=pPosfija;
	string aux = "";
	double op1, op2;
	for(int i=0; i<txtPosfija.length();i++)
	{
		switch (txtPosfija[i]) 
		{
			case '^':
    		op2 = pilaResul->VerCima(); pilaResul->Desapilar();
    		op1 = pilaResul->VerCima(); pilaResul->Desapilar();
    		pilaResul->Apilar(pow(op1, op2));
    		break;
    		case '*':
    		op2 = pilaResul->VerCima(); pilaResul->Desapilar();
    		op1 = pilaResul->VerCima(); pilaResul->Desapilar();
    		pilaResul->Apilar(op1*op2);
    		break;
    		case '/':
    		op2 = pilaResul->VerCima(); pilaResul->Desapilar();
    		op1 = pilaResul->VerCima(); pilaResul->Desapilar();
    		pilaResul->Apilar(op1/op2);
    		break;
			case '+':
    		op2 = pilaResul->VerCima(); pilaResul->Desapilar();
    		op1 = pilaResul->VerCima(); pilaResul->Desapilar();
    		pilaResul->Apilar(op1 + op2);
    		break;
    		case '-':
    		op2 = pilaResul->VerCima(); pilaResul->Desapilar();
    		op1 = pilaResul->VerCima(); pilaResul->Desapilar();
    		pilaResul->Apilar(op1 - op2);
    		break;
			default:
			aux = txtPosfija[i];
    		pilaResul->Apilar(atof(aux.c_str()));
    	
    		break;
		}
		
	}
	cout<<pilaResul->VerCima();
}

int main(){ 

    int op; 
	string valor="";
	string converPosfija="";
	cout<<"Ingrese la funcion en Infija: "<<endl;
	cin>>valor;
	cout<<"\n============================="<<endl;
	cout<<"Conversion en Postfijo: ";
	converPosfija=convertir(valor);
	cout<<converPosfija<<endl;
	cout<<"RESULTADO:  ";
	resolverPosfija(converPosfija);
	cout<<"\n============================="<<endl;
	system("pause");

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *