Examen de Estructuras de Datos y Algoritmos 1. Al escribir un programa informático es usual que el compilador interno revise si los delimitadores que el programador ha utilizado a lo largo de su código son correctos, en el sentido de abrirlos y cerrarlos apropiadamente. Evidentemente ningún programa se considera correcto si existe al menos un par de delimitadores que no coinciden (abrir llaves y cerrar paréntesis, por ejemplo). Si consideramos únicamente los delimitadores: paréntesis “(”, “)”; llaves “{”,”}” y corchetes ”[” , ”]”, escriba un algoritmo que verifique si tales delimitadores han sido usados correctamente. Use al menos una de las siguientes estructuras de datos de acuerdo a lo que usted considere conveniente: pilas, colas, listas. Además, asuma que dispone de funciones de lectura y escritura de variables tipo char y string y una función que reconoce el final de un archivo de texto. 2. Considere el siguiente algoritmo para ordenar un arreglo A de tamaño n, que se basa en el principio de “Divide y vencerás” y cuyas etapas se ejemplifican a continuación: Dado un arreglo A=[p…r]: Dividir: El arreglo A=[p…r] se particiona en dos nuevos subarreglos no vacíos A=[p…q] y A=[q+1…r] de manera que cada elemento de A=[p…q] es menor o igual que cada elemento de A=[q+1…r]. El índice q se calcula como parte del proceso de particionamiento. Vencer: Los dos subarreglos A=[p…q] y A=[q+1…r] se ordenan por llamadas recursivas al algoritmo de ordenamiento. Combinar: Dado que los subarreglos están ordenados y se ordenan dentro del mismo arreglo (no se usan estructuras de datos adicionales), el arreglo original queda ordenado también. El algoritmo de ordenamiento se puede implementar como sigue: ORDENAMIENTO (A,p,r) If p < r then q= Particion(A,p,r) ORDENAMIENTO (A,p,q) ORDENAMIENTO (A,q+1,r) Para ordenar el arreglo completo A, la llamada inicial es: ORDENAMIENTO (A,1,tamaño[A]). La clave del algoritmo es el proceso de Partición. Este proceso reordena el subarreglo A=[p…r] dentro del mismo arreglo. Toma en primer lugar el elemento x=A[p] como un “pivote” alrededor del cual se particiona A=[p…r] en dos regiones, A=[p…q] y A=[q+1…r] desde el inicio hasta el final del arreglo A=[p…r] respectivamente, de manera que cada elemento de A=[p…q] es menor o igual que x y cada elemento de A=[q+1…r] es mayor o igual que x. Por ejemplo, dado el arreglo A[p…r]=[5,3,2,6,4,1,3,7], el algoritmo inicia con x=A[p]=5, y devuelve como resultado final el arreglo A[p..r]=[3,3,2,1,4,6,5,7] con q correspondiente a la posición en la que A[q]=4. Escriba una función Particion(A,p,r) que realice la partición del arreglo A con las propiedades indicadas e ilustre su funcionamiento tomando como entrada el arreglo A=[13,19,9,5,12,8,7,4,6,21].