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