martes, febrero 27, 2007

Validando paréntesis en una cadena

Como se sabe, los paréntesis se utilizan para agrupar elementos, o para modificar la prioridad en una evaluación. Y como es bien sabido, cuando se tienen muchos paréntesis, se pueden omitir algunos que abren o cierran al momento de generar una cadena que los utilice (como al programar en LISP por ejemplo).

El evaluar los paréntesis en una expresión arimética es usado habitualmente como ejemplo, para explicar el uso de una estructura de datos simple, llamado pila.

La pila solo se le pueden agregar elementos nuevos por un solo lado, llamado el tope y para trabajar con ella, ésta tiene dos operaciones básicas, push para poner un nuevo elemento en el tope de la pila. y pop para extraer el último elemento del tope de la pila.

Aunque teóricamente se pueden apilar elementos hasta el infinito, dado que no existe un límite para el tope, en la práctica estamos limitados por el método de implementación y lugar donde se realiza. Particularmente, en una computadora, el límite de la pila esta marcado por la cantidad de memoria que se puede utilizar para la pila. Por ello existen tres elementos más que describen a una pila: un indicador de principio de pila, un indicador de tope actual y un indicador del límite máximo de la pila.

El indicador actual se incrementa si se hace un push, y se decrementa si se hace un pop. Y por supuesto, debe marcar un error cuando se esta en la base en donde el principio de pila es igual a indicador actual; lo que significa que la pila esta vaciá y se desea extraer un elemento (se marca underflow). De igual forma si el indicador actual es igual a límite máximo de la pila, que significa que estamos en el límite máximo, y se desea agregar un nuevo elemento se debe marcar un error (overflow).

Para evaluar la concordancia de paréntesis en una expresión mediante una pila, lo que se hace es un push a la pila con un "(" cada vez que se encuentra en la expresión, y se hace un pop por cada ")" encontrado.

Después de recorrer toda la expresión que contiene paréntesis, si los paréntesis están correctos, la pila debe terminar vacía. En caso de que exista algún problema de concordancia de paréntesis, aparecerá un underflow si hay más paréntesis que cierran de los que abren, o la pila no estará vacía si es lo opuesto.

Esto es muy útil para estudiar la estructura de datos pila, pero en mi caso simplemente usé un contador: se incrementa por cada paréntesis que abre, y se decrementa por cada paréntesis que cierra. Al final devuelve 0 si hay igual número de paréntesis que abren y cierran. Devuelve -1 si encuentra en algún momento un paréntesis que cierra sin haber encontrado previamente uno que abre y > 0 si hay más paréntesis que abren de los que cierran.

El código implementado como una función en lenguaje C lo pueden ver en:

http://wiki.lidsol.net/wiki/index.php?title=Contando_par%C3%A9ntesis

A continuación coloco el código:

int cta_parents(char* cadena){
int cta=0;

for(;*cadena; cadena++){
if('('==*cadena)
cta++;
else if( ')' ==*cadena){
cta--;
if(cta<0)
return(cta);
}
}
return(cta);
}

Etiquetas:

martes, febrero 20, 2007

Una reflexión post-CONSOL

Ya ha terminado el CONSOL 2007 y con ello, tiempo para hacer evaluaciones acerca de lo acontecido.

Hasta antes de participar en el CONSOL, creía en una idea manifiesta de knish, básicamente consistente en que la función de divulgación del CONSOL ya se había cumplido, que ya es de sobra conocido por lo menos la existencia del Software Libre; así que es ya redundante hablar de ello en un congreso.

Y sin embargo, durante la realización del congreso, me ha sorprendido que hubiera una asistencia concurrida a las pláticas orientadas a la divulgación; pensadas para un público que aún no ha tenido contacto con el Software Libre ni de nombre.

Ahora, ¿que quisieramos hacer con los temas básicos?, ¿qué sigan existiendo en los congresos de SL?. En principio creo que incluirnos en los congresos no hace mal y gradualmente al decaer el público, éstos terminarán desapareciendo.

Pero ¿ese es el sentido de un congreso?; supongo que no, y por ello para que se excluyan antes, es indispensable que todos aquellos "creyentes" del FLOSS, aportemos nuestro granito de arena difundiendo, divulgando o pregonando lo que es el FLOSS.

O realizando cualquier actividad que lo impulse, como por ejemplo el FLISOL, que en este 2007 se realizará el 28 de abril; recordando que cualquier parte puede ser sede y que cualquiera puede participar.

lunes, febrero 12, 2007

CONSOL en la Facultad de Ingeniería.

En estos momentos ya debe ser muy conocido que el Congreso Nacional de SOftware Libre (CONSOL 2007), comienza el día de mañana martes, y que este año la sede es la Facultad de Ingeniería de la UNAM en C. U.

Espero puedan darse una vuelta por allá.