10 - Ejemplo práctico 1: validación de paréntesis

10.1 Idea general

Comprobar que paréntesis, corchetes y llaves están equilibrados exige recordar el orden de apertura. La pila resuelve el problema al desapilar siempre el último delimitador abierto y verificar que coincide con el cierre actual.

10.2 Reglas de validación

  1. Recorrer la cadena caracter a caracter.
  2. Si aparece una apertura ((, [, {), apilarla.
  3. Si aparece un cierre (), ], }), desapilar y comparar:
    • Si la pila está vacía o no coincide el par, la expresión es inválida.
    • Si coincide, continuar.
  4. Al final, la pila debe quedar vacía.

10.3 Casos comunes a contemplar

  • Delimitadores extra o faltantes: cierres sin apertura previa o aperturas que nunca se cierran.
  • Texto sin delimitadores: una cadena vacía o sin paréntesis se considera válida si la pila termina vacía.
  • Secuencias anidadas: la última apertura debe cerrar primero (LIFO).

10.4 Ejemplo breve en pseudocódigo

def validar_parentesis(texto):
  pila = []
  pares = {')': '(', ']': '[', '}': '{'}

  for c in texto:
    if c in '([{':
      pila.append(c)
    elif c in ')]}':
      if not pila or pila.pop() != pares[c]:
        return False

  return len(pila) == 0

El algoritmo es O(n) en tiempo y O(n) en espacio en el peor caso (cuando todos los caracteres son aperturas).

10.5 Extensiones habituales

  • Posición del error: almacenar índices para reportar dónde falla.
  • Ignorar zonas: omitir cadenas literales o comentarios antes de validar para evitar falsos positivos.
  • Delimitadores adicionales: agregar pares como <> o marcadores de plantillas si el lenguaje lo requiere.

Practicar esta validación ayuda a reforzar la intuición LIFO y a enfrentar variaciones comunes en entrevistas técnicas.

10.6 Programa completo listo para ejecutar

def validar_parentesis(texto):
  pila = []
  pares = {')': '(', ']': '[', '}': '{'}

  for c in texto:
    if c in '([{':
      pila.append(c)
    elif c in ')]}':
      if not pila or pila.pop() != pares[c]:
        return False

  return len(pila) == 0


if __name__ == "__main__":
  casos = [
    "(a + b) * (c + d)",
    "([{}])",
    "( [ ) ]",
    "funcion(x[2] + arr{1})",
  ]

  for texto in casos:
    print(texto, "=>", "OK" if validar_parentesis(texto) else "ERROR")