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");