Tengo una duda con respecto a la creación de una pila es c++ con la librería stl. Dicha pila tiene que ser aquella que, cuando el usuario ingrese una expresión algebraica por teclado, por ejemplo (a + { b * c – d } / e), entonces como salida del programa sería, si dicha expresión algebraica es correcta o incorrecta, es decir, si esta correctamente construida o no. Un ejemplo de un error sería por ejemplo (a + b o { d + [ e * f } ]. Mi duda principal sería que, aunque sé como se hace una pila en general, no sé como comparar los elementos entre sí para saber si los paréntesis, corchetes y llaves están formados correctamente. Sé que hay que usar una variable tipo caracter para la "ecuación" y un booleano que se active cuando sea correcta o incorrecta la ecuación, para posteriormente mostrar por pantalla si la ecuación algebraica es correcta o no.
Lo que llevo es lo siguiente, que también plantee un algoritmo dentro del programa mientras lo analizaba:
#include<iostream>
#include<stack>
using namespace std;
int main(){
stack<char> pila;
int a,b,c,d;
cout<<"Ingrese valor para a,b,c,d"<<endl;
cout<<"Ingrese valor para a"<<endl;
cin>>a;
cout<<"Ingrese valor para b"<<endl;
cin>>b;
cout<<"Ingrese valor para c"<<endl;
cin>>c;
cout<<"ingrese valor para d"<<endl;
cin>>d;
//Algoritmo para la función que se situa en esta parte del programa
// i) Leer el primer símbolo
//(1) Si es un símbolo de apertura de ( ‘(‘, ‘[‘, ó ‘{‘ ), guardarlo en la PILA.
//(2) Si es un símbolo de cierre de parentización ( ‘)’, ‘]’, ‘}’ ), extraer el tope de la PILA y comprobar que ambos símbolos se corresponden.
//(3) En otro caso, no hacer nada.
//ii) Si no estamos al final, leer el siguiente símbolo de la LISTA e ir a (i.1).
//iii) Si estamos al final:
//(1) Si la PILA está vacía -> OK.
//(2) Caso contrario, la expresión es errónea
char ecuacion; //le he puesto char porque lleva llaves, corchetes y parentesis {[(
cout<<"Ingrese la ecuacion que desea resolver (usando parentesis, corchetes y llaves)"<<endl;
cin>>ecuacion;
int sw=0; //este sw se colocara en cero si la ecuacion esta bien formada, es decir, primero { despues [ y despues ( lo mismo para los cierres
int sw=1; //este sw se colocara en 1 si dicha ecuacion esta incorrecta
if (sw==0)
cout<<"Verdadero. La ecuación esta correctamente escrita"<<endl;
if (sw==1)
cout<<"Falso. La escuación esta escrita de forma incorrecta"<<endl;
}
Lo de declarar las variables para que me calcule el resultado matemático de la ecuación no es importante ni lo necesito (es opcional), pero me gustaría saber como lograrlo ya que no sé como implementarlo, aunque creo que hay que usar una librería especial.
Con respecto a mi duda principal, como dije anteriormente, no sé como comparar los elementos para saber si la ecuación esta correctamente formada, ni como hacer para buscar dentro de una "variable" tipo carácter, un paréntesis, un corchete y una llave, y como se haría para buscarlas por orden de prioridad para después compararlas entre si? es decir, primero buscar en la variable tipo carácter el paréntesis, después el corchete y después la llave, o en orden inverso, que sería la llave, el corchete y después el paréntesis, que posiblemente sería la mejor manera de implementarla la ultima porque que estamos hablando de una estructura de datos tipo pila (ultimo en llegar, primero en salir). Agradecería mucho sus respuestas