Advertisement
davidcastrosalinas

20201120 Ejemplo de utilización de un stack para validación de sintáxis o balanceo de paréntesis

Nov 20th, 2020
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. /**####CLASE STACK  ****/
  6. #include <stack>
  7. template <class Tipo>
  8. class Stack : private stack<Tipo> {
  9. public:
  10.     void push(Tipo _valor) {
  11.         stack<Tipo>::push(_valor);
  12.     }
  13.  
  14.     Tipo pop() {
  15.         Tipo temp = stack<Tipo>::top();
  16.         stack<Tipo>::pop();
  17.         return temp;
  18.     }
  19.  
  20.     bool empty () {
  21.         return stack<Tipo>::empty();
  22.     }
  23.  
  24.     /**Metodos Miembros*/
  25.     int contar();
  26. };
  27.  
  28. template <class Tipo>
  29. int Stack<Tipo>::contar() {
  30.     int cuantos = 0;
  31.     while (!this->empty()) {
  32.         this->pop();
  33.         cuantos ++;
  34.     }
  35.     return cuantos;
  36. }
  37.  
  38.  
  39. bool esSintaxisValidaSimple(string cadena){
  40.     Stack<char> s;
  41.     bool bEsValido = true;
  42.     char caracterActual;
  43.     for(unsigned int i=0; i < cadena.size(); i++){
  44.         caracterActual = cadena[i];
  45.         if(caracterActual == '(')
  46.             s.push(caracterActual);
  47.         else if(caracterActual == ')') {
  48.             //si tengo bloque de cierre y no tengo datos de entrada es inválido
  49.             if(s.empty())
  50.                bEsValido = false;
  51.             else if(caracterActual == ')' && s.pop() != '(') //busco equivalencia de simbolos de llaves
  52.                 bEsValido = false;
  53.         }
  54.     }
  55.     if(!s.empty())
  56.         bEsValido = false;
  57.     return bEsValido;
  58. }
  59.  
  60.  
  61.  
  62. bool esSintaxisValida(string cadena){
  63.     Stack<char> s;
  64.     bool bEsValido = true;
  65.  
  66.     for(unsigned int i=0; i < cadena.size(); i++){
  67.         if(cadena[i] == '(' || cadena[i] == '{' || cadena[i] == '[')
  68.             s.push(cadena[i]);
  69.  
  70.         else if(cadena[i] == ')' || cadena[i] == '}' || cadena[i] == ']') {
  71.             if(s.empty())
  72.                bEsValido = false;
  73.             else {
  74.                 char t = s.pop();
  75.                 //busco equivalencia de simbolos de llaves
  76.                 if(  (cadena[i] == ')' && t != '(')
  77.                    ||(cadena[i] == '}' && t != '{')
  78.                    ||(cadena[i] == ']' && t != '['))
  79.                     bEsValido = false;
  80.             }
  81.         }
  82.     }
  83.     if(!s.empty())
  84.         bEsValido = false;
  85.     return bEsValido;
  86. }
  87.  
  88. int main()
  89. {
  90.  
  91. /*(A)
  92. (A)*[B]
  93. ((A)*[B]}
  94. (A+B)
  95. (A+B+C)
  96. (A+B+C)+{a-c}
  97. (A+B+C)+{a-c}*[Z]
  98. (A+{B+C})+{a-c}*[Z]{
  99. (A+{B+C})+{a-[c]}*[Z]
  100. 7-((x*((x + y)/ (j - 3)) + y) / (4 - 5/2))
  101. 7-((x*((x + y)/ ((j - 3)) + y) / (4 - 5/2))*/
  102.  
  103.    string cadena = "(A+{B+C})+{a-[c]}*[Z]";
  104.    if(esSintaxisValida(cadena))
  105.         cout <<"es valida ("<<cadena<<")";
  106.    else
  107.         cout <<"es invalida ("<<cadena<<")";
  108.     return 0;
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement