Download Compilado Programacion III Estructura de Datos
Document related concepts
Transcript
UNIVERSIDAD DE LA AMAZONIA FACULTAD DE INGENIERIA DEPARTAMENTO DE EDUCACIÓN A DISTANCIA PROGRAMA TECNOLOGÍA EN INFORMÁTICA Y SISTEMAS COMPILADO PROGRAMACIÓN III ESTRUCTURAS DE DATOS PREPARADO POR YOIS S. PASCUAS RENGIFO Ingeniera de Sistemas Magíster en Ciencias de la Información y las Comunicaciones y.pascuas@udla.edu.co Junio 2014 Compilado Programación III 1 TABLA DE CONTENIDO INTRODUCCIÓN ............................................................................................................................................ 3 OBJETIVOS...................................................................................................................................................... 4 OBJETIVOS ESPECÍFICOS ........................................................................................................................... 4 COMPETENCIAS ............................................................................................................................................ 5 CRITERIOS DE DESEMPEÑO ..................................................................................................................... 5 1. ESTRUCTURAS DE DATOS ................................................................................................................ 5 1.1 CLASIFICACIÓN DE LAS ESTRUCTURAS DE DATOS .............................................................................9 1.2 ESTRUCTURAS DE DATOS ESTÁTICAS ......................................................................................................... 10 1.2.1 ARREGLOS ............................................................................................................................................... 11 1.2.2 ARRAYS MULTIDIMENSIONALES ................................................................................................. 16 1.2.3 INICIALIZACIÓN DE ARRAYS MULTIDIMENSIONALES ..................................................... 19 1.2.4 ARRAYS DE MÁS DE DOS DIMENSIONES ................................................................................... 21 1.2 ESTRUCTURAS DE DATOS DINÁMICAS........................................................................................................ 22 1.2.1 LINEALES................................................................................................................................................. 22 1.1.2.1 Pilas ....................................................................................................................................................................... 22 1.1.2.2 Colas ...................................................................................................................................................................... 27 1.1.2.3 Listas ..................................................................................................................................................................... 32 1.2.2 NO LINEALES ......................................................................................................................................... 35 1.2.2.4 Árboles ................................................................................................................................................................. 35 1.2.2.5 Gráfos .................................................................................................................................................................... 42 2. 2 REFERENCIAS..................................................................................................................................... 46 Universidad de la Amazonia - Tecnología en Informática y Sistemas INTRODUCCIÓN La información que se procesa en el computador es un conjunto de datos, que pueden ser simples o estructurados. Los datos simples son aquellos que ocupan sólo una localidad de memoria, mientras que los estructurados son un conjunto de casillas de memoria a las cuales se hacen referencia mediante un identificador único. Debido a que por lo general se tiene que tratar con conjuntos de datos y no con datos simples (enteros, reales, booleanos, etc.) que por sí solos no dicen nada, ni sirven de mucho, es necesario tratar con estructuras de datos adecuadas a cada necesidad. Las estructuras de datos son una colección de datos cuya organización se caracteriza por las funciones de acceso que se usan para almacenar y acceder a elementos individuales de datos (DATOS-APUNTES). La representación de la información es fundamental en ciencias de la computación y en informática. El propósito principal de la mayoría de los programas de computadores es almacenar y recuperar información, además de realizar cálculos. De modo práctico, los requisitos de almacenamiento y tiempo de ejecución exigen que tales programas deban organizar su información de un modo que soporte procesamiento eficiente. Por estas razones, el estudio de estructuras de datos y de los algoritmos que las manipulan constituye el núcleo central de la informática y de la computación. Se muestra en este compilado de programación III para la Tecnología en Informática y Sistemas de la Universidad de la Amazonia, los conceptos y ejemplos básicos de las estructuras de datos estáticas (arreglos) y las estructuras de datos dinámicas (listas, arboles, grafos, pilas y colas). Compilado Programación III 3 OBJETIVOS Conceptualizar y aplicar las estructuras de datos más importantes utilizadas en el área de las ciencias de la computación e informática. OBJETIVOS ESPECÍFICOS - Conocer los mecanismos de abstracción y su importancia para la resolución de problemas. - Adquirir conceptos de programación modular y de reutilización de los componentes de software. - Desarrollar programas basándose en tipos abstractos de datos (TAD). - Conocer los tipos de datos más usuales en programación, sus implementaciones más comunes y su utilidad. - Identificar entre diferentes implementaciones alternativas de una abstracción de datos, y razonar sobre la solución escogida basándose en la eficiencia de éstas. 4 Universidad de la Amazonia - Tecnología en Informática y Sistemas COMPETENCIAS - Utilizar los conocimientos de programación estructurada y modularización. Conocer y aplicar los algoritmos básicos de ordenación y búsqueda. Aplicar las principales estructuras de datos estáticas y dinámicas así como su manejo y aplicación. Utilizar conceptos básicos de complejidad computacional. CRITERIOS DE DESEMPEÑO - - Soluciono problemas cotidianos, diseñando aplicaciones que contengan estructuras de control, instrucciones primitivas elementales y modularización. Representación y solución de problemas utilizando estructuras de datos dinámicas y estáticas. 1. ESTRUCTURAS DE DATOS Compilado Programación III 5 A pesar de la gran potencia de los computadores actuales, la eficiencia de los programas sigue siendo una de las características más importantes a considerar. Los problemas complejos que procesan los computadores cada vez más obligan, sobre todo, a pensar en su eficiencia dado el elevado tamaño que suelen alcanzar. Hoy, más que nunca, los profesionales deben formarse en técnicas de construcción de programas eficientes. En sentido general, una estructura de datos es cualquier representación de datos y sus operaciones asociadas. Bajo esta óptica, cualquier representación de datos, incluso un número entero o un número de coma flotante almacenado en la computadora, es una sencilla estructura de datos. En un sentido más específico, una estructura de datos es una organización o estructuración de una colección de elementos dato. Así, una lista ordenada de enteros almacenados en un array es un ejemplo de dicha estructuración. Una estructura de datos es una agregación de tipos de datos compuestos y atómicos en un conjunto con relaciones bien definidas. Una estructura significa un conjunto de reglas que contienen los datos juntos. Define (Joyanes Aguilar & Zahonero Martínez , 2008) a las estructuras de datos como un conjunto de asociaciones o relaciones (estructura) que implica a los elementos combinados. APLICABILIDAD DE LAS ESTRUCTURAS DE DATOS Sistemas Operativos Buscadores Inteligencia Artificial Análisis de complejidad algorítmica Gráficas por computador - UTILIDAD DE LAS ESTRUCTURAS DE DATOS La programación estructurada significa escribir un programa de acuerdo a las siguientes reglas: 1. El programa tiene un diseño modular. 2. Los módulos son diseñados de un modo descendente. 3. Cada módulo se codifica utilizando las tres estructuras de control básicas: a. Secuencia b. Selección c. Repetición 6 Universidad de la Amazonia - Tecnología en Informática y Sistemas ETAPAS EN LA SELECCIÓN DE UNA ESTRUCTURA DE DATOS Los pasos a seguir para seleccionar una estructura de datos que resuelva un problema son: 1. Analizar el problema para determinar las restricciones de recursos que debe cumplir cada posible solución. 2. Determinar las operaciones básicas que se deben soportar y cuantificar las restricciones de recursos para cada una. Ejemplos de operaciones básicas son la inserción de un dato en la estructura de datos, suprimir un dato de la estructura o encontrar un dato determinado en dicha estructura. 3. Seleccionar la estructura de datos que cumple mejor los requisitos o requerimientos. Este método de tres etapas para la selección de una estructura de datos es una aproximación centrada en los datos. Primero se diseñan los datos y las operaciones que se realizan sobre ellos, a continuación viene la representación de esos datos y, por último, viene la implementación de esa representación. Las restricciones de recursos sobre ciertas operaciones clave, como búsqueda, inserción de registros de datos y eliminación de registros de datos, normalmente conducen el proceso de selección de las estructuras de datos. TIPOS ABSTRACTOS DE DATOS Los tipos abstractos de datos (TAD) describen un conjunto de objetos con la misma represen- tación y comportamiento . Los tipos abstractos de datos presentan una separación clara entre la interfaz externa de un tipo de datos y su implementación interna. La implementación de un tipo abstracto de datos está oculta. Por consiguiente, se pueden utilizar implementaciones alternativas para el mismo tipo abstracto de dato sin cambiar su interfaz. La especificación de un tipo abstracto de datos se puede hacer de manera informal, o bien, de forma mas rigurosa, una especificación formal. En la Compilado Programación III 7 especificación informal se describen literalmente los datos y la funcionalidad de las operaciones. La especificación formal describe los datos, la sintaxis y la semántica de las operaciones, considerando ciertas operaciones como axiomas, que son los constructores de nuevos datos. Una buena especificación formal de un tipo abstracto de datos debe poder verificar la bondad de la implementación. En la mayoría de los lenguajes de programación orientados a objetos, y en particular en Java, los tipos abstractos de datos se implementan mediante clases. Una clase es un tipo de dato definido por el programador que sirve para representar objetos del mundo real. Un objeto de una clase tiene dos componentes: un conjunto de atributos o variables instancia y un conjunto de comportamientos (métodos). Los atributos también se llaman variables instancia o miembros dato, y los comportamientos se llaman métodos miembro. class Circulo { private double centroX; private double centroY; private double radio; public double superficie(){} } Un objeto es una instancia de una clase, y una variable cuyo tipo sea la clase es una referencia a un objeto de la clase. Circulo unCirculo; // variable del tipo clase Circulo [] tipocirculo = new Circulo[10]; // array de referencias La definición de una clase, en cuanto a visibilidad de sus miembros, tiene tres secciones: pública, privada y protegida. La sección pública contiene declaraciones de los atributos y del comportamiento del objeto que son accesibles a los usuarios del objeto. Se recomienda la declaración de los constructores en la sección pública. La sección privada contiene los métodos miembro y los miembros dato, que son ocultos o inaccesibles a los usuarios del objeto. Estos métodos miembro y atributos dato son accesibles sólo por los métodos miembro del objeto. Los miembros de una clase con visibilidad protected son accesibles para cualquier usuario de la clase que se encuentre en el mismo package; también son accesibles para las clases derivadas. El acceso por defecto, sin modificador, tiene las mismas propiedades que el acceso protected para las clases que se encuentran en el mismo package. 8 Universidad de la Amazonia - Tecnología en Informática y Sistemas Para recordar Un tipo abstracto de datos puede definirse mediante la ecuación: TAD = Representación (datos) + Operaciones (funciones y procedimientos) OPERACIONES BÁSICAS Una estructura de datos define la organización e interrelación de estos y un conjunto de operaciones que se pueden realizar sobre ellos. Las operaciones básicas son: - Alta, adicionar un nuevo valor a la estructura. Baja, borrar un valor de la estructura. Búsqueda, encontrar un determinado valor en la estructura para realizar una operación con este valor, en forma secuencial o binario (siempre y cuando los datos estén ordenados). Otras operaciones que se pueden realizar son: - Ordenamiento, de los elementos pertenecientes a la estructura. Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas. Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización de cada operación. De esta forma, la elección de la estructura de datos apropiada para cada problema depende de factores como la frecuencia y el orden en que se realiza cada operación sobre los datos. 1 1.1 CLASIFICACIÓN DE LAS ESTRUCTURAS DE DATOS La programación estructurada se refiere a un conjunto de técnicas que aumentan considerablemente la productividad del programa reduciendo en elevado grado el tiempo requerido para escribir, verificar, depurar y mantener los programas. Utiliza un número limitado de estructuras de 1 http://es.wikipedia.org/wiki/Estructura_de_datos Compilado Programación III 9 control que minimizan la complejidad de los programas y por consiguiente reducen los errores y hacen los programas en general más eficientes. La siguiente figura resume la principal clasificación de las estructuras de datos: Figura. Clasificación básica de las estructuras de datos Unidimensionales Estáticas Arreglos o arrays Bidimensionales Multidimensionales Pilas Estructuras de Datos Lineales Colas Listas Dinámicas Árboles No lineales Gráfos 1.2 ESTRUCTURAS DE DATOS ESTÁTICAS Son aquellas en las que se asigna una cantidad fija de memoria cuando se declara la variable. En grandes ocasiones se necesitan colecciones de datos que crezcan y reduzcan su tamaño en memoria a medida que el 10 Universidad de la Amazonia - Tecnología en Informática y Sistemas ays. Un array almacena muchos elementos del mismo tipo, tales como veinte enteros, números de coma flotante o quince caracteres. Los arrays pueden ser de una dimenores, que son los mas utilizados ; de dos dimensiones tablas o matrices ; también de s dimensiones. Java progrese. proporciona lalogra clase String, que representadinámicas. una secuencia de programa Esto se implementando las estructuras (Benitezcon López) y las operaciones cadenas más comunes, y también dispone de la clase especialingBuffer para procesar cadenas que pueden sufrir cambios. Una cadena se considera 1.2.1 ARREGLOS objeto de la clase String que no puede modificarse. Un array o arreglo (lista o tabla) es una secuencia de datos del mismo tipo. Los datos se llaman elementos del array y se numeran consecutivamente 0, 1, 2, 3 ... El tipo de elementos almacenados en el array puede ser cualquier dato simple de Java o de un tipo previamente declarado como una clase. o arreglo1 (lista o tabla) es una secuencia de datos del mismo tipo. Los datos se llaman Normalmente, el array se utiliza para almacenar tipos tales como char, int del array y seonumeran consecutivamente 0, 1, 2, 3 ... El tipo de elementos almacefloat. A RRAYS (ARREGLOS) l array puedeUn serarray cualquier dato simple de Java o de un tipo previamente declarado como puede contener, por ejemplo, la edad de los alumnos de una clase, de cada de un mestipos en una ciudad o elo float . Normalmente,laseltemperaturas array se utiliza paradíaalmacenar tales comodeterminada char, int número de personas que residen en cada una de las diecisiete comunidades ay puede contener, por ejemplo, la edad de los alumnos de una clase, las temperaturas autónomas españolas. Cada ítem del array se denomina elemento. a de un mes en una ciudad determinada o el número de personas que residen en cada una Los elementos de un array se numeran, como ya se ha comentado, isiete comunidades autónomas españolas. Cada ítem del array se denomina elemento. consecutivamente 0, 1, 2, 3,... Estos números se denominan valores índice subíndice del array. El término se utiliza ya que especifica, 0, 1, 2, ementos de uno array se numeran, como ya se“subíndice” ha comentado, consecutivamente igual que en matemáticas, una secuencia tal como a0, a_, a2... Estos s números senúmeros denominan valores índice o subíndice del array. El término “subíndice” se localizan la posición del elemento dentro del array, proporcionando que especifica, igualdirecto que en matemáticas, una secuencia tal como a0, a1, a2... Estos númeacceso al array. an la posiciónSidel elemento dentro del array, proporcionando acceso directo al array. el nombre del array es a, entonces a[0] es el nombre del elemento que ombre del array a,posición entonces a[0] el nombre del elemento está en la posición está es en la 0, a[1] es es el nombre del elemento que estáque en la posición 1, etc. En general, el elemento i-ésimo está en la posición i-1, de modo que el nombre del elemento que está en la posición 1, etc. En general, el elemento i-ésimo si el array tiene n elementos, sus nombres son a[0], a[1],...,a[n-1]. posición i-1, de modo que si el array tiene n elementos, sus nombres son a[0], Figura. Array a con seis elementos a[n-1]. Gráficamente, se representa así el array a con seis elementos. a 25.1 34.2 5.25 7.45 0 1 2 3 6.09 7.54 4 5 Figura 3.1 Array de seis elementos El array a tiene 6 elementos: a[0] contiene 25.1, a[1] contiene 34.2, a[2] contiene 5.25, a[3] contiene 7.45, a[4] contiene 6.09 y a[5] contiene 7.54. El ay a tiene 6diagrama elementos: a[0] 2contiene a[1] 34.2, a[2] de la figura representa25.1, realmente unacontiene región de la memoria de contiene la computadora, ya que un array se contiene almacena 7.54 siempre sus elementos 3] contiene 7.45, a[4] contiene 6.09 y a[5] . Elcon diagrama de la Figura 3.1 en una secuencia de posiciones de memoria contigua. En Java, los índices realmente una región la memoria de lalímite computadora, ya que unsuperior array se de un array de siempre tienen como inferior 0 y como índice el almacena tamaño menos 1.de posiciones de memoria contigua. on sus elementos endel unaarray secuencia a, los índices de un array siempre Compilado Programación III tienen como límite inferior 0 y como índice superior 11 del array menos 1. Declaración de un a r r ay Declaración de un array Un array se declara de modo similar a otros tipos de datos, excepto que se debe indicar al compilador que es un array, lo que se hace con los corchetes. int [] v; float w[]; Los corchetes se pueden colocar de dos formas: - A continuación del tipo de datos. - A continuación del nombre del array. Así, la sintaxis de declaración de variables array en Java es: tipo [] identificador; tipo identificador[]; El primer formato indica que todos los identificadores son arrays del tipo. En el segundo formato, array es sólo el identificador al que le siguen los []. Ejemplo Se escriben distintas declaraciones de arrays. - char cad[], p; cad es un array de tipo char. p es una variable de tipo char. - int [] v, w; tanto v como w son declarados arrays unidimensionales de tipo int. - double [] m, t[], x; m y x son array de tipo double; t es un array de array con elementos de tipo double. Creación de un array Java considera que un array es una referencia a un objeto. En consecuencia, para que realmente se cree (instancie) el array, usa el operador new junto al tipo de los elementos del array y su número. Por ejemplo, para crear un array que guarde las notas de la asignatura de música en un aula de 26 alumnos: float [] notas; notas = new float[26]; Se puede escribir en una misma sentencia: float [] notas = new float[26]; La sintaxis para declarar y definir un array de un número de elementos determinado es: 12 Universidad de la Amazonia - Tecnología en Informática y Sistemas tipo nombreArray[] = new tipo[numeroDeElementos]; o bien, tipo nombreArray[]; nombreArray = new tipo[numeroDeElementos]; Ejemplo Se declaran y se crean arrays de diferentes tipos de datos. 1. int a[] = new int [10]; a es un array de 10 elementos de tipo int. 2. final int N = 20; float [] vector; vector = new float[N]; Se ha creado un array de N elementos de tipo float. Para acceder al tercer elemento y leer un valor de entrada: vector[2]=Float.valueOf(entrada.readLine())).floatValue(); Precaución Es un error frecuente acceder a un elemento de un array fuera del rango en que está definido. Java comprueba en tiempo de compilación que los índices estén dentro de rango, en caso contrario genera un error. Durante la ejecución del programa, un acceso fuera de rango genera una excepción. Ejemplos 1. Crea un array de 10 posiciones de números con valores pedidos por teclado. Muestra por consola el indice y el valor al que corresponde. Haz dos métodos, uno para rellenar valores y otro para mostrar. (Disco Duro) import javax.swing.JOptionPane; public class arrayApp { Compilado Programación III 13 public static void main(String[] args) { //Esto es opcional final int TAMANIO=10; int num[]=new int[TAMANIO]; //Invocamos las funciones rellenarArray(num); mostrarArray(num); } public static void rellenarArray(int lista[]){ for(int i=0;i<lista.length;i++){ String texto=JOptionPane.showInputDialog("Introduce un número"); lista[i]=Integer.parseInt(texto); } } public static void mostrarArray(int lista[]){ for(int i=0;i<lista.length;i++){ System.out.println("En el indice "+i+" esta el valor "+lista[i]); } } } 2. Crea un array de números de un tamaño pasado por teclado, el array contendrá números aleatorios primos entre los números deseados, por último nos indicar cual es el mayor de todos. Haz un método para comprobar que el número aleatorio es primo, puedes hacer todos lo métodos que necesites. import javax.swing.JOptionPane; public class arrayNumAleatoriosApp { public static void main(String[] args) { //Indicamos el tamaño String texto=JOptionPane.showInputDialog("Introduce un tamaño"); int num[]=new int[Integer.parseInt(texto)]; 14 Universidad de la Amazonia - Tecnología en Informática y Sistemas //Invocamos las funciones rellenarNumAleatorioArray(num, 0, 9); mostrarArray(num); } public static void rellenarNumAleatorioArray(int lista[], int a, int b){ for(int i=0;i<lista.length;i++){ //Generamos un número entre los parametros pasados lista[i]=((int)Math.floor(Math.random()*(a-b)+b)); } } public static void mostrarArray(int lista[]){ for(int i=0;i<lista.length;i++){ System.out.println("En el indice "+i+" esta el valor "+lista[i]); } } } 3. Crea un array de números y otro de String de 10 posiciones donde insertaremos notas entre 0 y 10 (debemos controlar que inserte una nota valida), pudiendo ser decimal la nota en el array de números, en el de Strings se insertaran los nombres de los alumnos. Después, crearemos un array de String donde insertaremos el resultado de la nota con palabras. - Si la nota esta entre 0 y 4,99 , sera un suspenso - Si esta entre 5 y 6,99 , sera un bien. - Si esta entre 7 y 8,99 sera un notable. - Si esta entre 9 y 10 sera un sobresaliente. Muestra por pantalla, el alumno su nota y su resultado en palabras. Crea los métodos que creas conveniente. import javax.swing.JOptionPane; public class LetraDNIApp { public static void main(String[] args) { //Declaramos como constante por lo que dividir final int DIVISOR=23; Compilado Programación III 15 //Insertamos el DNI String texto=JOptionPane.showInputDialog("Escribe los numero de tu DNI"); int dni=Integer.parseInt(texto); //Usamos la formula int res=dni-(dni/DIVISOR*DIVISOR); //Invocamos el metodo char letra=letraNIF(res); //Mostramos el DNI completo System.out.println("Tu DNI es " +dni+letra); } public static char letraNIF(int res){ //Definimos el array de char char letrasNIF[]={'T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'}; //Devolvemos el valor en la posicion del array return letrasNIF[res]; } } 1.2.2 ARRAYS MULTIDIMENSIONALES Los arrays vistos anteriormente se conocen como arrays unidimensionales (una sola dimensión) y se caracterizan por tener un solo subíndice. Estos arrays se conocen también por el término listas. Los arrays multidimensionales son aquellos que tienen más de una dimensión y, en consecuencia, más de un índice. Los más usuales son los de dos dimensiones, conocidos también por el nombre de tablas o matrices. Sin embargo, es posible crear arrays de tantas dimensiones como requieran sus aplicaciones, ya sean tres, cuatro o más. Un array de dos dimensiones (m × n) equivale a una tabla con múltiples filas y múltiples columnas: Figura. Estructura de un array de dos dimensiones 16 Universidad de la Amazonia - Tecnología en Informática y Sistemas cuencia, más de un índice. Los más usuales son los de dos dimensiones, conocidos también por el nombre de tablas o matrices. Sin embargo, es posible crear arrays de tantas dimensiones como requieran sus aplicaciones, ya sean tres, cuatro o más. Un array de dos dimensiones (m n) equivale a una tabla con múltiples filas y múltiples columnas (Figura 3.2). 0 1 2 3 n 0 1 2 3 4 m Figura 3.2 Estructura de un array de dos dimensiones En el array bidimensional de la figura, si las filas se etiquetan de 0 a m y las columnas de 0 a n, el número de elementos que tendrá el array será el resultado del producto (m+1)*(n+1). El sistema de localizar un elemento es por las coordenadas representadas por su número de fila y su número de columna (a, b). La sintaxis para la declaración de un array de dos dimensiones es: <tipo de datoElemento> <nombre array> [][]; o bien <tipo de datoElemento> [][]<nombre array>; Ejemplos de declaración de matrices : char pantalla[][]; int puestos[][]; double [][]matriz; Estas declaraciones no reservan memoria para los elementos de la matriz, realmente son referencias. Para reservar memoria y especificar el número de filas y de columnas se utiliza el operador new. Así, a partir de las declaraciones anteriores: pantalla = new char[80][24]; // matriz con 80 filas y 24 columnas puestos = new int[10][5]; // matriz de 10 filas por 5 columnas final int N = 4; matriz = new double[N][N]; // matriz cuadrada de N*N elementos Compilado Programación III 17 El operador new se puede aplicar a la vez que se hace la declaración. La sintaxis para definir una matriz es: <tipo de datoElemento> <nombre array>[][]= new <tipo de datoElemento> [<NúmeroDeFilas<] [<NúmeroDeColumnas>]; Ejemplo Crea dos arrays multidimensionales de 2×3 y rellénalos como quieras (números aleatorios, por teclado o definido al crear el array). Haz un método que sume los arrays multidimensionales, es decir, la posición 0, 0 del array1 con la posición del array2 y así sucesivamente, este método no debe devolver nada, haciendo que deba pasarse el array multidimensional de suma como parámetro. Muestra el contenido de cada array multidimensional. import java.util.Arrays; import javax.swing.JOptionPane; public class CapicuaApp { public static void main(String[] args) { //Introducimos un numero String numero=JOptionPane.showInputDialog("Introduce un número"); /* * Aprovechamos el String para averiguar la longitud del numero, * para crear un array compatible, y para dividirlo digitos */ int digitos[]=convierteNumeroAArray(numero, numero.length()); //Invocamos el metodo, segun el resultado mostramos un mensaje u otro if (EsCapicua(digitos)){ System.out.println("El numero "+numero+" es capicua"); }else{ System.out.println("El numero "+numero+" no es capicua"); } } public static int[] convierteNumeroAArray(String numero, int longitud){ 18 Universidad de la Amazonia - Tecnología en Informática y Sistemas int digitos[]=new int[longitud]; for(int i=0;i<digitos.length;i++){ digitos[i]=Character.getNumericValue(numero.charAt(i)); } return digitos; } public static boolean EsCapicua (int lista[]){ //Creamos otro array int listaprueba[]=new int [lista.length]; /* * Asignamos los valores al nuevo array lo hacemos añadiendo * los ultimos valores del primer array, al principio del nuevo array * ,es decir, le damos la vuelta al array */ for (int i=0, j=1;j<=lista.length;i++, j++){ listaprueba[i]=lista[lista.length-j]; } //Usamos el metodo de java.util.Arrays para comparar los arrays if (Arrays.equals(lista, listaprueba)){ return true; } return false; } } 1.2.3 INICIALIZACIÓN DE ARRAYS MULTIDIMENSIONALES La inicialización se hace encerrando entre llaves la lista de constantes, separadas por comas, que forma cada fila, como en los Compilado Programación III 19 tabla[2][1] 20 tabla[3][0] 24 tabla[3][1] 28 ejemplos siguientes: 3.2.1. Inicialización de a r r ay s multidimensionales Figura. de se dos LaTablas inicialización hacedimensiones encerrando entre llaves la lista de constantes, separadas por comas, que forma cada fila, como en los ejemplos siguientes: 1. int tabla1[][] = { {51, 52, 53},{54, 55, 56} }; Define una matriz de 2 filas por 3 columnas cada una. O bien con este formato más amigable: int tabla1[][] = { {51, 52, 53}, {54, 55, 56} }; 2. int tabla2[][] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; tabla1[][] Filas Columnas 0 1 2 0 51 52 53 1 54 55 56 tabla2[][] Filas 0 1 2 3 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12 Columnas Figura 3.3 Tablas de dos dimensiones Java trata los arrays de dos o más dimensiones como arrays de arrays, por esa razón se pueden crear arrays de dos dimensiones no cuadradas. Ejemplo Declaración y creación de arrays bidimensionales de distinto número de elementos por fila. 1. double tb[][] = { {1.5, -2.5}, {5.0, -0.0, 1.5} }; Se ha definido una matriz de 2 filas, la primera con dos columnas y la segunda con 3. 2. int[] a = {1,3,5}; int [] b = {2,4,6,8,10}; int mtb[][] = {a, b}; Se ha definido el array a de 3 elementos, el b de 4 elementos y la matriz 20 Universidad de la Amazonia - Tecnología en Informática y Sistemas mtb de 2 filas, la primera con 3 elementos o columnas y la segunda con 4. Java permite crear matrices de distintas formas, la definición que se realiza en el ejemplo, especifica primero el número de filas y, a continuación, el número de elementos de cada fila. 1.2.4 ARRAYS DE MÁS DE DOS DIMENSIONES Java proporciona la posibilidad de almacenar varias dimensiones, aunque raramente los datos del mundo real requieren más de dos o tres dimensiones. El medio más fácil de dibujar un array de tres dimensiones es imaginar un cubo, tal como se muestra en la siguiente figura. Un array tridimensional se puede considerar como un conjunto de arrays bidimensionales combinados para formar, en profundidad, una tercera dimensión. El cubo se construye con filas (dimensión vertical), columnas (dimensión horizontal) y planos (dimensión en profundidad). Por consiguiente, un elemento dado se localiza especificando su plano, fila y columna. A continuación se declara y define un array tridimensional equipos: Arrays (arreglos) y cadenas 75 int equipos[][][]= new int[3][15][10]; un elemento dado se localiza especificando su plano, fila y columna. A continuación se declara y define un array tridimensional equipos: Figura. Un array de tres dimensiones (4*5*3) int equipos[][][]= new int[3][15][10]; Ejemplo Figura 3.5 Un array de tres dimensiones (4 x 5 x 3) Crear un array tridimensional para representar los caracteres de un Ejemplo 3.8 libro y diseñar los bucles para de representar acceso.los caracteres de un libro y diseñar los bucles Crear un array tridimensional de acceso. array libro tieneIII tres dimensiones, [PAGINAS] [LINEAS] [COLUMNAS], que definen Compilado El Programación el tamaño del array. El tipo de datos del array es char, ya que los elementos son caracteres. 21 El método más fácil para acceder a los caracteres es mediante bucles anidados. Dado que el libro se compone de un conjunto de páginas, el bucle más externo es el bucle de página, y el bucle de columnas es el bucle más interno. Esto signi ca que el bucle de las se insertará entre los bucles de página y de columna. El array libro tiene tres dimensiones, [PAGINAS] [LINEAS] [COLUMNAS], que definen el tamaño del array. El tipo de datos del array es char, ya que los elementos son caracteres. El método más fácil para acceder a los caracteres es mediante bucles anidados. Dado que el libro se compone de un conjunto de páginas, el bucle más externo es el bucle de página, y el bucle de columnas es el bucle más interno. Esto significa que el bucle de filas se insertará entre los bucles de página y de columna. int pagina, linea, columna; final int PAGINAS = 500; final int LINEAS = 45; final int COLUMNAS = 80; char libro[][][] = new char[PAGINAS][ LINEAS][COLUMNAS]; for (pagina = 0; pagina < PAGINAS; ++pagina) for (linea = 0; linea < LINEAS; ++linea) for (columna = 0; columna < COLUMNAS; ++columna) <procesar libro[pagina][linea][columna]> 1.2 ESTRUCTURAS DE DATOS DINÁMICAS Al contrario que las estructuras de datos estáticas (arrays-listas, vectores y tablas- y estructuras), cuyo tamaño en memoria permanece inalterable durante la ejecución del programa, las estructuras de datos dinámicas crecen y se contraen a medida que se ejecuta el programa. Son aquellas cuya ocupación en memoria puede aumentar o disminuir en tiempo de ejecución. 1.2.1 LINEALES Es una estructura de datos que almacena y recupera sus elementos atendiendo a un orden estricto. 1.1.2.1 Pilas 22 Universidad de la Amazonia - Tecnología en Informática y Sistemas CONCEPTO DE PILA (stack) es una colección ordenada de elementos a los cuales sólo se puede ac Las pilas también como estructuras LIFO o se quitan (borran) de la lugar o extremo deselaconocen pila. Los elementos se añaden (Last-in, first-out, último en entrar primero en salir). Las rte superiorpilas (cima). Esteenescompiladores, el caso desistemas una pila de platos, una pila de libros, etc se utilizan operativos ordar y programas de aplicaciones. Una aplicación interesante es la evaluación de expresiones aritméticas, también la organización de la memoria. Una pila (stack) es una colección ordenada de elementos a los puede acceder por un a es una estructura decuales datossólo deseentradas ordenadas único lugar o extremo de la pila. Los elementos se minar por un extremo, llamado cima. añaden o se quitan (borran) de la pila sólo por su parte superior (cima). Este es el caso de una pila de platos, una pila de libros, etc. que sólo se pueden in Cuando se dice queordenada, la pila está ordenada, lo que se quiere decir que hay do se dice que la pila está lo que se quiere decir esesque hay un elemen un elemento al que se puede acceder primero (el que está encima de la pila), acceder primero (el que está encima de en la segundo pila), otro al que se pued otro elemento al que se puede acceder lugar elemento (justo el elemento que está debajo de la cima), un tercero, etc. No se requiere que las entradas do lugar (justo el elemento que está debajo de la cima), un tercero, etc. No se se puedan comparar utilizando el operador “menor que” (<) y pueden ser de cualquier tipo. ntradas se puedan comparar utilizando el operador “menor que” (<) y pued Las entradas de la pila deben ser eliminadas en el orden inverso al que se tipo. situaron en la misma. Por ejemplo, se puede crear una pila de libros, ntradas de situando la pila primero debenunser eliminadas orden inverso al que se situa diccionario, encima en de élel una enciclopedia y encima ambos una novela, de modo que la pila tendrá la novela en la parte or ejemplo,de se puede crear una pila de libros, situando primero un diccionario superior. enciclopedia y encima de ambos una novela, de modo que la pila tendrá la n Figura 3. Pila de libros uperior. Figura 9.1 Pila de libros Cuando se quitan los libros de la pila, primero debe quitarse la novela, luego la enciclopedia y por último el diccionario. Debido a su propiedad específica último en entrar, primero en salir se conoce a las pilas como estructuras de datos LIFO (last-in, first-out) do se quitan los libros de la pila, primero debe quitarse la novela, luego la enc Compilado Programación III mo el diccionario. 23 o a su propiedad específica último en entrar, primero en salir se conoce a ucturas de datos LI FO (last-in, first-out) Las operaciones usuales en la pila son Insertar y Quitar. La operación Insertar (push) añade un elemento en la cima de la pila, y la operación Pilas Quitar (pop) elimina o saca un elemento. 269 la pila. La Figura 9.2 muestra una secuencia de operaciones Insertar y Quitar. El último elemento Figura 4. Poner y quitar elementos de la pila Pilas 269 añadido a la pila es el primero que se quita de ella. la pila. La Figura 9.2 muestra una secuencia de operaciones Insertar y Quitar. El último elemento añadido a la pila es el primero que se quita de ella. Figura 9.2 Poner y quitar elementos de la pila La operación Insertar (push) sitúa un elemento dato en la cima de la pila, y Quitar (pop) elimina o(push) quita9.2 el elemento de la elementos pila. La operación Insertar sitúa un elemento dato en la de cima de la pila, y Quitar (pop) Figura Poner y quitar la pila eliminaFigura o quita5.elOperaciones elemento debásicas la pila. de una pila La operación Insertar (push) sitúa un elemento dato en la cima de la pila, y Quitar (pop) elimina o quita el elemento de la pila. Figura 9.39.3 Operaciones unapila pila Figura Operacionesbásicas básicas de de una La pila se puede implementar guardando los elementos en un array, en cuyo caso dimensión o longitud es fija.los También se puede utilizar un Vector Lasesu pila se puede implementar guardando loselementos elementos en un un array, enen cuyo caso su su dimenLa pila puede implementar guardando en array, cuyo caso dimenpara almacenar los elementos. Otra forma de implementación consiste en sión o longitud es También fija. También se puede utilizarun unVector Vector para para almacenar elementos. OtraOtra sión o longitud es fija. se puede utilizar almacenarloslos elementos. construir una lista enlazada, de modo que cada elemento de la pila forma de implementación consiste en construiruna unalista lista enlazada, enlazada, de que cada elemento forma forma de construir demodo que cada elemento unimplementación nodo de la lista.consiste La listaen crece o decrece según se añaden omodo se extraen, de la pila forma un nodo de la lista. La lista crece o decrece según se añaden o se extraen, respecrespectivamente, elementos de lista la pila; ésta es una representación dinámica, de la pila forma un nodo de la lista. La crece o decrece según se añaden o se extraen, respectivamente, elementos de la pila; ésta es una representación dinámica, y no existe limitación en su y noelementos existe limitación en ésta su tamaño excepto la memoria del computador. tivamente, de la pila; es una representación dinámica, y no existe limitación en su tamaño excepto la memoria del computador. tamaño excepto lapuede memoria computador. Una pila estardel vacía (no tiene elementos) o llena (en la representación con un array Una—arreglo—, pila puede siestar vacía (noaltiene elementos) oSillena (en la representación un array se ha llegado último elemento). un programa intenta sacar uncon elemento 24 Universidad de la Amazonia - Tecnología en Informática y Sistemas —arreglo—, si sevacía, ha llegado al último elemento). Si undebido programa sacar es unimposielemento de una pila se producirá un error, una excepción, a que intenta esa operación situación se denomina desbordamiento negativo (underflow). Poroperación el contrario, un de unable; pilaesta vacía, se producirá un error, una excepción, debido a que esa es siimposiprograma intenta poner un elemento en una pila negativo llena, se produce un error, ble; esta situación se denomina desbordamiento (underflow). Poruna el excepción, contrario, de si un Una pila puede estar vacía (no tiene elementos) o llena (en la representación con un array —arreglo—, si se ha llegado al último elemento). Si un programa intenta sacar un elemento de una pila vacía, se producirá un error, una excepción, debido a que esa operación es imposible; esta situación se denomina desbordamiento negativo (underflow). Por el contrario, si un programa intenta poner un elemento en una pila llena, se produce un error, una excepción, de desbordamiento (overflow) o rebosamiento. Para evitar estas situaciones se diseñan métodos que comprueban si la pila está llena o vacía. Especificaciones de una pila Las operaciones que sirven para definir una pila y poder manipular su contenido son las siguientes (no todas ellas se implementan al definir una pila): Tipo de dato Dato que se almacena en la pila. Operaciones - Crear Pila: Inicia. - Insertar (push): Quitar (pop): Pila vacía: Pila llena: Limpiar pila: Cima Pila: Tamaño de la pila: la pila. Pone un dato en la pila. Retira (saca) un dato de la pila. Comprueba si la pila no tiene elementos. Comprueba si la pila está llena de elementos. Quita todos sus elementos y deja la pila vacía. Obtiene el elemento cima de la pila. Número de elementos máximo que puede contener Ejemplo Realizaremos un ejemplo a modo de uso de pila. Uno de los casos más usados en informática de una pila es cuando queremos verificar si una determinada sentencia o instrucción está equilibrada en cuanto a número de paréntesis, corchetes o llaves de apertura y cierre. Cuando se escribe código de programación si no existe equilibrio entre signos de apertura (por ejemplo un paréntesis de apertura) y cierre (por ejemplo un paréntesis de cierre) ni siquiera debería procesarse la sentencia ya que no estaría formalmente bien construida. De esto se encargan los analizadores léxicos de los compiladores. Así que vamos a utilizar esta vez tan solo una clase Programa con el método main, donde vamos a ir analizando una sentencia para verificar si es Compilado Programación III 25 equilibrada o no en símbolos de paréntesis, recorriendo todos sus caracteres desde el inicio hasta el final. Iremos construyendo nuestra pila apilando un símbolo (cada vez que detectemos un símbolo de apertura o desapilando de ella cuando detectemos un símbolo de cierre. Tendremos que ir analizando todos los caracteres de una expresión y actuar cuando detectemos un paréntesis, operando en función de si el paréntesis leído es de abrir (“(”) o cerrar (“)”). El equilibrio en la escritura vendrá determinado al terminar el análisis en función de si la pila está vacía (hay equilibrio) o contiene algún elemento (no hay equilibrio). Ejemplo: analizamos la expresión “Hay varios países (México, España) que comparten el mismo idioma (español o castellano).” El resultado al finalizar el análisis de la sentencia sería que la pila está vacía, y esto querrá decir que nuestra sentencia es equilibrada en paréntesis y por tanto el resultado es correcto. Si analizáramos la expresión “Hay varios países (México, España) que comparten el mismo idioma (español o castellano.” El resultado al finalizar el análisis será que la pila contiene un paréntesis, lo que quiere decir que la expresión no es equilibrada y no tiene el mismo número de paréntesis abiertos que cerrados. Tendremos que tener en cuenta casos especiales como una expresión cuyo primer elemento sea un paréntesis de cierre. Por ejemplo: “Hay varios países )México, España(“ la consideraríamos una expresión incorrecta ya que si la pila está vacía el primer elemento siempre tendrá que ser un paréntesis de apertura y no uno de cierre. Tendremos en cuenta por tanto que además de equilibrio exista corrección en la forma de construcción (que no puedan existir cierres de paréntesis que no se hayan abierto). Vamos a escribir ahora el siguiente código con el que vamos a trabajar: /* Ejemplo Interface List, clase Stack aprenderaprogramar.com */ import java.util.Stack; public class Programa { public static void main(String arg[]) { String cadenano = "(Cadena no equilibrada en paréntesis(()()()))))"; String cadenasi = "(Cadena equilibrada en parentesis())"; System.out.println("Verificación equilibrado en paréntesis para cadenano:"); System.out.println(verificaParentesis(cadenano)); 26 Universidad de la Amazonia - Tecnología en Informática y Sistemas System.out.println("Verificación equilibrado en paréntesis para cadenasi:"); System.out.println(verificaParentesis(cadenasi)); } public static boolean verificaParentesis(String cadena) { Stack<String> pila = new Stack<String>(); int i = 0; while (i<cadena.length()) { // Recorremos la expresión carácter a carácter if(cadena.charAt(i)=='(') {pila.push("(");} // Si el paréntesis es de apertura apilamos siempre else if (cadena.charAt(i)==')') { // Si el paréntesis es de cierre actuamos según el caso if (!pila.empty()){ pila.pop(); } // Si la pila no está vacía desapilamos else { pila.push(")"); break; } // La pila no puede empezar con un cierre, apilamos y salimos } i++; } if(pila.empty()){ return true; } else { return false; } } } 1.1.2.2 Colas El tipo abstracto de datos Cola, es una estructura muy utilizada en la vida cotidiana y también en la resolución de problemas en programación. Esta estructura, al igual que las pilas, almacena y recupera sus elementos atendiendo a un orden estricto. Las colas se conocen como estructuras FIFO (firstin, first-out, primero en entrar-primero en salir), debido a la forma y orden de inserción y de extracción de elementos. Las colas tienen numerosas aplicaciones en el mundo de la computación: colas de mensajes, colas de tareas a realizar por una impresora, colas de prioridades, etc. Compilado Programación III 27 den de inserción y de extracción de elementos. Las colas tienen numerosas aplicaciones en el do de la computación: colas de mensajes, colas de tareas a realizar por una impresora, colas ioridades, etc. Una cola es una estructura de datos que almacena elementos en una lista 1. CONCEPTO DE aCOLA y permite acceder los datos por uno de los dos extremos de la lista. Un elemento se inserta en la cola (parte final) de la lista y se suprime o elimina cola es una estructura de (parte datos inicial, que almacena enaplicaciones una lista y utilizan permiteuna acceder a los por el frente frente) deelementos la lista. Las cola para almacenar elementos en su orden de aparición o concurrencia. s por uno de los dos extremos de la lista (Figura 10.1). Un elemento se inserta en la cola (parte ) de la lista y se suprime elimina por el frente (parte inicial, frente) de la lista. Las aplicacioFigura. Unaocola utilizan una cola para almacenar elementos en su orden de aparición o concurrencia. Los elementos se eliminan (se quitan) de la cola en el mismo orden en que Figura 10.1 Una cola se almacenan y, por consiguiente, una cola es una estructura de tipo FIFO (first-in, firs-out, primero en entrar-primero en salir o bien primero en llegaren ser a clientes en que un almacén es elementos primero se eliminan (seservido). quitan)Eldeservicio la coladeenatención el mismo orden en se almacenan un ejemplo típico de cola. os y, por iguiente, una cola es una estructura de tipo FI FO (first-in, firs-out, primero en entrar-primero La El acción de gestión de memoria lir o bien primero en llegar-primero en ser servido). servicio de atención a clientes en un intermedia (buffering) de trabajos o cén es un ejemplo típico de cola. La acción de gestión de memoria intermedia (buffering) de tareas de impresora en un jos o tareas de impresora en un distribuidor de impresoras otro ejemplo típico distribuidor(spooler) de esimpresoras (spooler) es otro más ejemplo típico deel proceso ola1. Dado que la impresión es una tarea (un trabajo) que requiere tiempo que cola. Dado que la impresión es una transmisión real de los datos desde la computadora a la impresora, se organiza una cola de tarea (un trabajo) que requiere más jos de modo que los trabajos se imprimen en el tiempo mismo orden el que sederecibieron por que elen proceso la de los datos desde consta de mpresora. Este sistema tiene el gran inconvenientetransmisión de que si real su trabajo personal la computadora a la impresora, se única página para imprimir y delante de su petición de impresión otra petición para organiza una cola existe de trabajos de modo trabajosdeberá se imprimen en el orden en que se recibieron imir un informe deque 300lospáginas, esperar a mismo la impresión deelesas 300 páginas antes de la impresora. Este sistema tiene el gran inconveniente de que si su se imprima su por página. trabajo personal consta de una única página para imprimir y delante de su recordar petición de impresión existe otra petición para imprimir un informe de 300 páginas, deberá esperar a la impresión de esas 300 páginas antes de que se imprima su página. na cola es unaA estructura recordar de datos cuyos elementos mantienen un cierto orden, de tal odo que sólo se pueden añadir elementos por un extremo, final de la cola, y eliminar Una cola es una estructura de datos cuyos elementos mantienen un cierto extraer por el orden, otro extremo, llamado frente. de tal modo que sólo se pueden añadir elementos por un extremo, final de la cola, y eliminar o extraer por el otro extremo, llamado frente. 28 Universidad de la Amazonia - Tecnología en Informática y Sistemas ecordemos que este caso sucede en sistemas multiusuario donde hay varios terminales y sólo una impresora vicio. Los trabajos se “encolan” en la cola de impresión. Especificaciones del tipo abstracto de datos Cola Las operaciones que sirven para definir una cola y poder manipular su contenido son las siguientes: Tipo de dato Elemento que se almacena en la cola. Operaciones - CrearCola - Insertar - Quitar - Cola vacía - Cola llena - Frente - Tamaño de la cola la cola. Inicia la cola como vacía. Añade un elemento por el final de la cola. Retira (extrae) el elemento frente de la cola. Comprueba si la cola no tiene elementos. Comprueba si la cola está llena de elementos. Obtiene el elemento frente o primero de la cola. Número de elementos máximo que puede contener En una cola, al igual que en una pila, los datos se almacenan de un modo lineal y el acceso a los datos sólo está permitido en los extremos de la cola. La forma que los lenguajes tienen para representar la Cola depende de donde se almacenen los elementos: en un array, en una estructura dinámica como puede ser un Vector (contenedor de Java) o en una lista enlazada. La utilización de arrays tiene el problema de que la cola no puede crecer indefinidamente, está limitada por el tamaño del array; como contrapartida, el acceso a los extremos es muy eficiente. Utilizar una lista enlazada permite que el número de nodos se ajuste al de elementos de la cola; por el contrario, cada nodo necesita memoria extra para el enlace, y también hay que tener en cuenta el límite de memoria de la pila del computador. Figura. Operaciones Insertar y Quitar en una Cola Compilado Programación III 29 no puede crecer indefinidamente, está limitada por el tamaño del array; como contrapartida, el acceso a los extremos es muy eficiente. Utilizar una lista enlazada permite que el número de nodos se ajuste al de elementos de la cola; por el contrario, cada nodo necesita memoria extra para el enlace, y también hay que tener en cuenta el límite de memoria de la pila del computador. 296 Estructuras de datos en Java Figura 10.2 Operaciones Insertar y Quitar en una Cola Ejemplo 10.2. COLAS IMPLEMENTADAS CON A RRAYS Cola que almacena 10 números en vector y realiza funciones de dar de altas introducidos, mostrar ,salir.una (Ejemplos en estática java) (arrays) o Al igualnumeros que las pilas, las colas seeliminar, implementan utilizando estructura una estructura dinámica (listas enlazadas, Vector...). En esta sección se considera la impleimport java.io.*; mentación con arrays. La declaración de una Cola ha de contener un array para almacenar los elementos de la cola y dos marcadores o apuntadores para mantener las posiciones frente y fin public class Colas { apuntando a la posición de la cabeza de la cola y el otro al primer de la cola, es decir, un marcador public staticalclass { // Declaracion clase decola, Colas espacio vacío que sigue final ClaseColas de la cola. Cuando un elementode se la añade a la se verifica static int max=10; // Tamano maximo de la Cola si el marcador fin apunta a una posición válida, y entonces se añade el elemento a la cola y se static int cola[]= new int[max]; // Declaracion del arreglo incrementa el marcador fin en 1. Cuando un elemento se elimina de la cola, se hace una prueba static int frente, fin; // Indicadores de inicio y fin de la Cola para ver si la cola está vacía y, si no es así, se recupera el elemento de la posición apuntada por el marcador de cabeza, y éste se {incrementa en 1. que inicializa el frente y el final de la ClaseColas() // Constructor La operación de poner un elemento en la cola comienza en la posición fin 0, y cada vez que Cola se añade un nuevo elemento se incrementa fin en 1. La extracción de un elemento se hace por el 30 de la Tecnologíaavanza en Informática Sistemas extremo contrario, frente, yUniversidad cada vez que se Amazonia extrae un-elemento frenteyuna posición. En la Figura 10.3 se puede observar cómo avanza el puntero frente al extraer un elemento. El avance lineal de frente y fin tiene un grave problema, deja huecos por la izquierda del array . Llega a ocurrir que fin alcanza el índice mas alto del array, sin que puedan añadirse frente=0; fin=0; System.out.println("Cola inicializada !!!"); } public static void Insertar(int dato) { if(fin==max) { // Esta llena la Cola? System.out.println("\nCola llena !!!"); return; } cola[fin++]=dato; System.out.println("Dato insertado !!!"); } public static void Eliminar() { System.out.println("\n\n<<< ELIMINAR >>>"); if(frente==fin) { // Esta vacia la Cola? System.out.println("\nCola vacia !!!"); return; } System.out.println("Elemento eliminado: "+cola[frente++]); } public static void Mostrar() { int i=0; System.out.println("\n\n<<< MOSTRAR >>>"); if(frente==fin) System.out.println("\nCola vacia !!!"); for(i=frente; i<fin; i++) { System.out.println("cola["+i+"]="+" "+cola[i]); } System.out.println("\nFrente= "+frente); System.out.println("Final = "+fin); System.out.println("Max = "+max); } } static ClaseColas Cola=new ClaseColas(); // Declaracion del objeto Cola // Funcion principal public static void main(String args[]) throws IOException { int op=0; do { System.out.println("\n\n<<< COLAS >>>"); System.out.println("1.- Altas"); System.out.println("2.- Eliminar"); System.out.println("3.- Mostrar"); Compilado Programación III 31 System.out.println("0.- Salir"); System.out.print("Opcion? ---> "); op=getInt(); switch(op) { case 1 : Altas(); break; case 2 : Cola.Eliminar(); break; case 3 : Cola.Mostrar(); break; } }while(op!=0); } public static void Altas() throws IOException { int elemento=0; System.out.println("\n\n<<< ALTAS >>>"); System.out.print("Elemento a insertar? ---> "); elemento=getInt(); Cola.Insertar(elemento); // Invocar el metodo Insertar del objeto Cola } // Funcion para capturar una cadena desde el teclado public static String getString() throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s = br.readLine(); return s; } // Funcion para capturar un entero desde el teclado public static int getInt() throws IOException { String s = getString(); return Integer.parseInt(s); } } 1.1.2.3 Listas La estructura de datos lista enlazada (ligada o encadenada, linked list): es una colección de elementos (denominados nodos) dispuestos uno a continuación de otro, cada uno de ellos conectado al siguiente por un “enlace” o “referencia”. Las listas enlazadas son estructuras muy flexibles y con numerosas aplicaciones en el mundo de la programación. Las estructuras de datos lineales de elementos homogéneos (listas, tablas, 32 Universidad de la Amazonia - Tecnología en Informática y Sistemas de otro, cada uno de ellos conectado al siguiente por un “enlace” o “referencia”. En el capítulo se desarrollan métodos para insertar, buscar y borrar elementos en listas enlazadas. De igual modo, se muestra el tipo abstracto de datos (TAD) que representa las listas enlazadas. Las listas enlazadas son estructuras muy f lexibles y con numerosas aplicaciones en el mundo de la programación vectores) utilizaban arrays para implementar tales estructuras, siendo los elementos de tipo primitivo (int, long, double...); también se ha utilizado la clase Vector, aunque los elementos, en este caso, han de ser referencias. 8.1. FUNDAMENTOS TEÓRICOS DE LISTAS ENLAZADAS Esta técnica obliga a fijar por adelantado el espacio a tablas, ocupar vectores) en memoria, Las estructuras de datos lineales de elementos homogéneos (listas, utilizaban de modo que, cuando se desea añadir un nuevo elemento que rebase el arrays para implementar tales los elementos primitivo long, tamaño prefijado del estructuras, array, no siendo es posible realizar de la tipo operación sin (int, que se double...); también ha utilizado lade clase Vector,Esta aunque los elementos, estea caso, produzca un se error en tiempo ejecución. característica se en debe que han de ser referencias. técnica obliga a fijar por el espacio en memoria, los arrays Esta hacen un uso ineficiente de adelantado la memoria. Gracias aa ocupar la asignación de se variables, se un pueden listas el de tamaño modo prefijado que la del de mododinámica que, cuando desea añadir nuevoimplementar elemento que rebase memoria física utilizada se corresponda con el número la array, no es posible realizar la operación sin que se produzca un errorde enelementos tiempo de de ejecución. tabla; para ello, se recurre a las referencias (apuntadores) que hacen un uso Esta característica se debe a que los arrays hacen un uso ineficiente de la memoria. Gracias más eficiente de la memoria, como ya se ha visto con anterioridad. a la asignación dinámica de variables, se pueden implementar listas de modo que la memoria física utilizada se corresponda conuna el número de elementos de lade tabla;; para ello, se recurre a las Una lista enlazada es colección o secuencia elementos dispuestos referencias (apuntadores) quela hque acencada un uso más eficiente de la mal emoria, comoelemento ya se ha visto uno detrás de otro, en elemento se conecta siguiente por un “enlace” o “referencia”. La idea básica consiste en construir una lista con anterioridad. cuyosenlazada elementos, llamados nodos, se componen de dos partes uno (campos): la otro, Una lista es una colección o secuencia de elementos dispuestos detrás de primera parte contiene la información y es, por consiguiente, un valor de un en la que cada elemento se conecta al siguiente elemento por un “enlace” o “referencia”. La idea tipo genérico (denominado Dato, TipoElemento, Info, etc.), y la segunda básica consiste enuna construir una lista cuyos elementos, nodos, se componen parte es referencia (denominado enlace llamados o sgte) que apunta (enlaza) de al dos partes (campos): primera parte siguiente laelemento de la contiene lista. la información y es, por consiguiente, un valor de un tipo genérico (denominado Dato, TipoElemento, Info, etc.), y la segunda parte es una Figura. Lista enlazada simple) referencia (denominado enlace o(representación sgte) que apunta (enlaza) al siguiente elemento de la lista. Figura 8.1 Lista enlazada (representación simple) La representación gráfica más extendida es aquella que utiliza una caja (un La representación gráfica más extendida es aquella que utiliza una caja (un rectángulo) con rectángulo) con dos secciones en su interior. En la primera sección se dos secciones enel suelemento interior. En la primera sección se la escribe el elemento o valor del dato, y escribe o valor del dato, y en segunda sección, el enlace o en la segunda sección, el enlaceuna o referencia mediante de la al cajanodo y apunta referencia mediante flecha que sale una de flecha la caja que y sale apunta siguiente. al nodo siguiente. Figura. Lista enlazada (representación gráfica típica) Compilado Programación III 33 Figura 8.2 Lista enlazada (representación Listas gráfica típica) enlazadas 227 Para recordar Una lista enlazada consta de un número de elementos, y cada elemento tiene do omponentes (campos), una referencia al siguiente elemento de la lista y un valor, qu uede ser de cualquier tipo Figura 8.2 Lista enlazada (representación gráfica típica) de la Los enlaces se representan por flechas para facilitar la comprensión Los enlaces conexión se representan flechas paraque facilitar la comprensión de en la conexión en entre dospor nodos e indicar el enlace tiene la dirección memoria del siguiente nodo. Los enlaces también sitúan los nodos en una s nodos e indicar que el enlace tiene la dirección en memoria del siguiente nodo. Los enla Parasecuencia. recordar En la Figura, los nodos forman una secuencia desde el primer mbién sitúan los nodos secuencia. En El la primer Figuranodo 8.2,selos nodos forman una secuen elemento (e1)en al una último elemento (en). enlaza al segundo, se enlaza alconsta tercero, asínúmero sucesivamente llegar al elemento último nodo, Una éste lista enlazada deyun de elementos, yprimer cada dos al seg de el primer elemento (e1 ) al último elemento (enhasta ). El nodo setiene enlaza que debe ser representado de forma diferente para significar que este nodo (campos), una referencia al siguiente elemento de la listadiferentes y un valor, que que al no tercero, se enlazayaasí ningún otro. La siguiente éste se componentes enlaza sucesivamente hastafigura llegarmuestra al último nodo, que debe puederepresentaciones ser de cualquiergráficas tipo utilizadas para dibujar el campo enlace del último resentado denodo. forma diferente para significar que este nodo que no se enlaza a ningún o Figura 8.3 muestra diferentes representaciones gráficas utilizadas para dibujar el cam Diferentes representaciones gráficas del nodo último Los Figura. enlaces ace del último nodo.se representan por flechas para facilitar la comprensión de la conexión entre dos nodos e indicar que el enlace tiene la dirección en memoria del siguiente nodo. Los enlaces también sitúan los nodos en una secuencia. En la Figura 8.2, los nodos forman una secuencia desde el primer elemento (e1 ) al último elemento (en ). El primer nodo se enlaza al segundo, éste se enlaza al tercero, y así sucesivamente hasta llegar al último nodo, que debe ser representado de forma diferente para significar que este nodo que no se enlaza a ningún otro. La Figura 8.3 muestra diferentes representaciones gráficas utilizadas para dibujar el campo Figura 8.3nodo. Diferentes representaciones gráficas del nodo último enlace del último CLASIFICACIÓN DE LISTAS ENLAZADAS 2. CLASIFICACIÓN DEenLISTAS ENLAZADAS Las listas se pueden dividir cuatro categorías : 1. Listas simplemente s listas se pueden dividir en cuatro enlazadas. categorías :Cada • • • nodo (elemento) contiene un único enlace que lo conecta al nodo siguiente o nodo sucesor. La lista es eficiente enenlazadas. recorridos directos simplemente Cada (“adelante”). nodo (elemento) contiene un único Listas enlace que Figura 8.3 Diferentes representaciones gráficas del nodo último conecta al nodo siguiente nodo sucesor. La lista es eficiente enuno recorridos direc 2. Listas doblementeo enlazadas. Cada nodo contiene dos enlaces, a (“adelante”).su nodo predecesor y otro a su nodo sucesor. La lista es eficiente tanto 8.2.doblemente CLASIFICACIÓN DE nodo LISTAS ENLAZADAS Listas enlazadas. Cada contiene dos enlaces, uno a su nodo predece y otro a su nodo sucesor. lista es eficiente Las listas se pueden dividir La en cuatro categorías : tanto en recorrido directo (“adelante”) co 34 Universidad de la Amazonia - Tecnología en Informática y Sistemas en recorrido (“atrás”). • Listasinverso simplemente enlazadas. Cada nodo (elemento) contiene un único enlace que lo en recorrido directo (“adelante”) como en recorrido inverso (“atrás”). conectasimplemente al nodo siguiente o nodo sucesor. La lista es eficiente en recorridos directos Lista circular enlazada. Una lista enlazada simplemente en la que el últi 3. Lista circular simplemente enlazada. Una lista enlazada simplemente en la que el último elemento (cola) se enlaza al primer elemento (cabeza) de tal modo que la lista puede ser recorrida de modo circular (“en anillo”). 4. Lista circular doblemente enlazada. Una lista doblemente enlazada en la que el último elemento se enlaza al primer elemento y viceversa. Esta lista se puede recorrer de modo circular (“en anillo”) tanto en dirección directa (“adelante”) como inversa (“atrás”). La implementación de cada uno de los cuatro tipos de estructuras de listas 228 Estructuras de datos en Java se puede desarrollar utilizando referencias. Figura. Representación gráfica una lista enlazada de listas se puede desarroLa implementación de cada uno de los de cuatro tipos de estructuras llar utilizando referencias. El primer nodo, frente, una lista esgráfica el nodo por cabeza. La lista Figura 8.4de Representación de apuntado una lista enlazada encadena nodos juntos desde el frente al final (cola) de la lista. El final se identifica el nodo cuyo el L valor La nlista El primer ncomo odo, frente, de una lista campo es el nodoreferencia apuntado portiene cabeza. a listanull. encadena odos se recorre desde el primero al último nodo; en cualquier punto del recorrido juntos desde el frente al final (cola) de la lista. El final se identifica como el nodo cuyo campo la posición actual se referencia por el puntero (pointer) actual. Una lista vacía referencia tiene el valor null. La lista se recorre desde el primero al último nodo;; en cualquier (no contiene nodos), se representa con el puntero cabeza con nulo (null). punto del recorrido la posición actual se referencia por el puntero (pointer) actual. Una lista vacía (no contiene nodos), se representa con el puntero cabeza con nulo (null). 1.2.2 NO LINEALES 8.3. TIPO ABSTRACTO DE DATOS (TAD) LISTA Árboles Una lista 1.2.2.4 se utiliza para almacenar información del mismo tipo, con la característica de que puede contener un número indeterminado de elementos y que estos elementos mantienen un orden El árbol es una estructura de datos muy explícito. Este ordenamiento explícito implica que cada elemento (un nodo de la lista) contiene la importante en informática y en ciencias de dirección del siguiente elemento. la computación. Los árboles son Una l ista e s u na e structura d e d atos d inámica. E l número de nodos puede variar rápidamente estructuras no lineales, al contrario que enlos un proceso, por inserciones o disminuyendo por eliminación de nodos. arrays aumentando y las listas enlazadas, que constituyen estructuras lineale Las inserciones se pueden realizar por cs.ualquier punto de la lista: por la cabeza (inicio), por el final, a partir o antes de un nodo determinado de la lista. Las eliminaciones también se pueden Los árboles se utilizan para representar realizar en cualquier punto;; además, se eliminan nodos dependiendo del campo de información fórmulas algebraicas, para organizar o objetos dato que seen desea suprimir la lista. orden de detal forma que las búsquedas sean muy eficientes y en aplicaciones diversas formal tales del como 8.3.1. Especificación TAD Lista Compilado Programación III Matemáticamente, una lista es una secuencia de cero o más elementos de un determinado tipo. 35 (a1, a2, a3, ... , a n) donde n >= 0, si n = 0 la lista es vacía. Los elementos de la lista tienen la propiedad de que sus elementos están ordenados de 368 Estructuras de datos en Java INTRODUCCIÓN El árbol es una estructura de datos muy importante en informática y en ciencias de la computa- inteligencia artificial o algoritmos de cifrado. Casi todos los sistemas ción. Los árboles son estructuras no lineales, al contrario que los arrays y las listas enlazadas, operativos almacenan suslineales. archivos en árboles o estructuras similares a que constituyen estructuras Los árbolesde se las utilizan para representar fórmulas algebraicas, parase organizar objetos orárboles. Además aplicaciones citadas, los árboles utilizan en en diseño den de tal forma que las búsquedas sean muy eficientes y en aplicaciones diversas tales como de compiladores, procesado de texto y algoritmos de búsqueda. inteligencia artificial o algoritmos de cifrado. Casi todos los sistemas operativos almacenan sus archivos en árboles o estructuras similares a árboles. Además de las aplicaciones citadas, los Intuitivamente, el concepto de árbol implica una estructura en la que los árboles se utilizan en diseño de compiladores, procesado de texto y algoritmos de búsqueda. datos se En organizan modoel concepto que los elementos están este capítulo sede estudiarán de árbol general y los de tipos información de árboles más usuales, relacionados travéso árbol de ramas. árbolse genealógico esaplicaciones el ejemplo binario yentre binario sí de a búsqueda ordenado. El También estudiarán algunas típicasrepresentativo del diseño y la construcción de árboles. de árbol general. típico más del concepto La figura representa un ejemplo de árbolYgeneral, gráficamente puede verse 13.1. ÁRBOLES GENERALES TERMINOLOGÍA como un árbol invertido, la implica raíz en parteenmás desela que salen Intuitivamente, el conceptocon de árbol una la estructura la quealta, los datos organizan de ramas que llegan a las hojas, que están en la parte baja. modo que los elementos de información están relacionados entre sí a través de ramas. El árbol genealógico es el ejemplo típico más representativo del concepto de árbol general. La Figura 13.1 un ejemplo de árbol general, puede verse como un árbol invertido, con la Figura.representa Estructura jerárquica tipográficamente árbol raíz en la parte más alta, de la que salen ramas que llegan a las hojas, que están en la parte baja. Un árbol consta de un Figura conjunto de elementos, denominados nodos y 13.1finito Estructura jerárquica tipo árbol de un conjunto finito de líneas dirigidas, denominadas ramas, que conectan consta de un conjunto finito de elementos, denominados nodos y de un conjunto los nodos.UnElárbol número de ramas asociado con un nodo es el grado del nodo. finito de líneas dirigidas, denominadas ramas, que conectan los nodos. El número de ramas asociado con un nodo es el grado del nodo. Definición 1 Definición 1 Un árbol consta de un conjunto finito de elementos, llamados nodos y de un árbol de consta de undirigidas, conjunto finito de elementos, llamados nodos y de un conjunto conjuntoUn finito líneas llamadas ramas, que conectan los nodos. finito de líneas dirigidas, llamadas ramas, que conectan los nodos. Definición 2 Un árbol es un conjunto de uno o más nodos tales que: 1. Hay un nodo diseñado especialmente llamado raíz. 2. Los nodos restantes se dividen en n≥0 conjuntos disjuntos,T1...Tn, tal que cada uno de estos conjuntos es un árbol. A T1 ... Tn se les denomina subárboles del raíz. 36 Universidad de la Amazonia - Tecnología en Informática y Sistemas Si un árbol no está vacío, entonces el primer nodo se llama raíz. Observe en la definición 2 que el árbol ha sido definido de modo recursivo, ya que los subárboles se definen como árboles. Terminología Figura 13.2 Árbol Además del nodo raíz, existen muchos términos utilizados en la descripción de un árbol. En la Figura 13.3, el nodo A es el raíz. Utilizando el concepto de árboles genealógicos, un nodo puede ser raíz, considerado existen muchos utilizados la descripción de los atributos comotérminos padre si tiene nodos en sucesores. . Terminología de los atributos del nodo de En la Figura 13.3, el nodo A es el raíz. Utilizando el concepto de árboles genealógicos, Figura. Árbol general puede ser considerado como padre si tiene nodos sucesores. Figura 13.3 Árbol hijos. general Estos nodos sucesores se llaman Por ejemplo, el nodo B es el padre de los hijos E y F. El padre de H es el nodo D. Un árbol puede representar nodos sucesores se llaman hijos. Por nodo B es los hijos y F. El diversas generaciones en ejemplo, la familia.elLos hijos de el unpadre nodo yde los hijos deEestos se llaman descendientes, y el padre y los abuelosendelaun nodo son H es el nodo D.hijos Un árbol puede representar diversas generaciones familia. Lossus hijos ascendientes. Por ejemplo, los nodos E, F, I y J son descendientes de B. do y los hijos de estos hijos se llaman descendientes, y el padre y los abuelos de un nodo Cada nodo no raíz tiene un único padre y cada padre tiene cero o más nodos scendientes. Por ejemplo, los nodos I y J padre son descendientes de B. Cada hijos. Dos o más nodos E, conF, el mismo se llaman hermanos. Un nodo nodo no tal como E, cero I, J, G y H se llamahijos. nodoDos hoja. un único padresiny hijos, cada padre tiene o más nodos o más nodos con el mismo llaman hermanos. Un de nodo hijos, como E,al nodo I, J, Gy se llama nododistancia hoja. El nivel un sin nodo es sutal distancia raíz. LaHraíz tiene una vel de un nodocero es sudedistancia nodo La que raíz está tieneenuna distancia sí nodo misma, sí misma,alpor elloraíz. se dice el nivel 0. Loscero hijosdedel están en0.elLos nivel 1, sus en el en nivel y así e dice que estáraíz en el nivel hijos delhijos nodoestán raíz están el 2, nivel 1, sucesivamente. sus hijos están en Una cosa importante que se aprecia entre los niveles de nodos es la relación , y así sucesivamente. Una cosa importante que se aprecia entre los niveles de nodos es la entre niveles y hermanos. Los hermanos están siempre al mismo nivel, pero no todos los nodos de un mismo nivel son necesariamente hermanos. Por ejemplo, en el nivel 2 (Figura siguiente), C y D son hermanos, al igual que lo son G,H, e I, pero D y G no son hermanos, ya que ellos tienen diferentes padres. Figura. Terminología de árboles Compilado Programación III 37 relación entre niveles y hermanos. Los hermanos están siempre al mismo nivel, pero no todos los nodos de un mismo nivel son necesariamente hermanos. Por ejemplo, en el nivel 2 (Figura 13.4), C y D son hermanos, al igual que lo son G, H, e I, pero D y G no son hermanos, ya que ellos tienen diferentes padres. Figura 13.4 Terminología de árboles Un camino es una secuencia de nodos en los que cada nodo es adyacente al siguiente. Cada nodo del árbol puede ser alcanzado (se llega a él) Un camino es una secuencia de nodos en los que cada nodo es adyacente al siguiente. Cada siguiendo un único camino que comienza en el nodo raíz. En la figura, el nodo del camino árbol puede serelalcanzado llega a él) siguiendopor un AFI. únicoIncluye caminodos queramas comienza en el desde raíz a la (se hoja I, se representa nodo raíz.distintas En la Figura 13.4, el camino desde el raíz a la hoja I, se representa por AFI. Incluye AF y FI. dos ramas distintas AF y FI. La altura o profundidad de unesárbol es el dedel la hoja delmás camino La altura o profundidad de un árbol el nivel denivel la hoja camino largomás desde la raíz largo desde la 1raíz más uno. Por definición1, la altura de un árbol vacío es más uno. Por definición , la altura de un árbol vacío es 0. La Figura 13.4 contiene nodos en tres 0. La figura contiene nodos en tres niveles: 0, 1 y 2. Su altura es 3. niveles: 0, 1 y 2. Su altura es 3. Definición Definición El nivel de un nodo es su distancia desde el nodo raíz. La altura de un árbol nivel de la del camino másel largo desde másde uno. El nivelesdeelun nodo eshoja su distancia desde nodo raíz.elLaraíz altura un árbol es el nivel de la hoja del camino largo desde eldiferentes raíz más uno. Figura. Árboles más de profundidades 38 1 Universidad de la Amazonia - Tecnología en Informática y Sistemas Definición El nivel de un nodo es su distancia desde el nodo raíz. La altura de un árbol es el nivel de la hoja del camino más largo desde el raíz más uno. Árboles. Árboles binarios y árboles ordenados 371 También se suele definir la profundidad de un árbol como el nivel máximo de cada nodo. En consecuencia, la profundidad del nodo raíz es 0, la de su hijo 1, etc. Las dos terminologías son aceptadas. 1 Figura 13.5 Árboles de profundidades diferentes Un árbol se divide en subárboles. Un subárbol es cualquier estructura conectada debajo delUn nodo raíz. es Cada nodo estructura de un árbol es la raíz un Un árbol se divide por en subárboles. subárbol cualquier conectada por de debajo subárbol que de se un define todos sus El primer del nodo raíz. Cada nodo árbol por es la el raíznodo de uny subárbol que descendientes. se define por el nodo y todos nodo de un subárbol se conoce como el nodo raíz del subárbol y se utiliza sus descendientes. El primer nodo de un subárbol se conoce como el nodo raíz del subárbol y se para nombrar el subárbol. Además, los subárboles se pueden subdividir en utiliza para nombrar el subárbol. Además, los subárboles se pueden subdividir en subárboles. En subárboles. la Figura 13.4, BCD es un subárbol al igual que E y FGHI. Obsérvese que, por esta definición, un nodo simple subárbol. Poresconsiguiente, el al subárbol B se puede dividirObsérvese en subárboles C por yD Eneslaun figura, BCD un subárbol igual que E y FGHI. que, mientras que F contiene los subárboles G, H . Se dice quePor G, consiguiente, H, I, C y D son estael subárbol definición, un nodo simple es une Isubárbol. el B se puede dividir en subárboles C y D mientras que el subárbol F subárbolessubárbol sin descendientes. contiene los subárboles G, H e I. Se dice que G, H, I, C y D son subárboles sin descendientes. Definición recursiva El concepto de subárbol conduce a una definición recursiva de un árbol. Un árbol es un conjunto de nodos que: Compilado Programación III 1. Es vacío. 39 2. O tiene un nodo determinado, llamado raíz, del que jerárquicamente descienden cero o más subárboles, que son también árboles. Definición recursiva El concepto de subárbol conduce a una definición recursiva de un árbol. Un árbol es un conjunto de nodos que: 1. Es vacío. 2. O tiene un nodo determinado, llamado raíz, del que jerárquicamente descienden cero más subárboles, que son también árboles. Resumen de definiciones 1. El primer nodo de un árbol, normalmente dibujado en la posición superior, se denomina raíz del árbol. 2. Las flechas que conectan un nodo con otro se llaman arcos o ramas. 3. Los nodos terminales, esto es, nodos de los cuales no se deduce ningún nodo, se denominan hojas. 4. Los nodos que no son hojas se denominan nodos internos. 5. En un árbol donde una rama va de un nodo n1 a un nodo n2, se dice que n1 es el padre de n2 y que n2 es un hijo de n1. • n1 se llama ascendiente de n2 si n1 es el padre de n2 o si n1 es el padre de un ascendiente de n2. • n2 se llama descendiente de n1 si n1 es un ascendiente de n2. • Un camino de n1 a n2 es una secuencia de arcos contiguos que van de n1 a n2. • La longitud de un camino es el número de arcos que contiene o, de forma equivalente, el número de nodos del camino menos uno. • El nivel de un nodo es la longitud del camino que lo conecta al nodo raíz. • La profundidad o altura de un árbol es la longitud del camino más largo que conecta el raíz a una hoja. • Un subárbol de un árbol es un subconjunto de nodos del árbol, conectados por ramas del propio árbol, esto es, a su vez un árbol. • Sea S un subárbol de un árbol A: si para cada nodo n de SA, SA contiene también todos los descendientes de n en A, SA se llama un 40 Universidad de la Amazonia - Tecnología en Informática y Sistemas • • • • La profundidad o altura de un árbol es la longitud del camino más largo que conecta el raíz a una hoja. Un subárbol de un árbol es un subconjunto de nodos del árbol, conectados por ramas del propio árbol, esto es, a su vez un árbol. subárbol completo de A. Sea S un subárbol de un árbol A: si para cada nodo n de SA, SA contiene también todos los • Un árbol está cuando, un número máximo descendientes de nequilibrado en A, SA se llama undado subárbol completo de A.k de hijos de cada nodo y la altura del árbol h, cada nodo de nivel k < h-1 tiene Un árbol está equilibrado dado un número máximo k de sihijos exactamente k hijos. Elcuando, árbol está equilibrado perfectamente, cadade cada nodo y la altura h, cada de nivel kk hijos. < h-1 tiene exactamente k hijos. El árbol está nododel de árbol nivel l<h tienenodo exactamente equilibrado perfectamente, si cada nodo de nivel l<h tiene exactamente k hijos. Figura 13.6 Un árbol y sus nodos Representación gráfica de un árbol Las formas más frecuentes de representar en papel un árbol son como árbol Árboles. Árboles binarios y árboles ordenados 373 invertido y como una lista. Representación como árbol invertido 13.1.2. Representación gráfica de un árbol más frecuentes de representar en papel un árbol son como árbol invertido y como Es Las el formas diagrama o carta de organización utilizado hasta ahora en las una lista. diferentes figuras. El nodo raíz se encuentra en la parte más alta de una jerarquía, de la que descienden ramas que van a parar a los nodos hijos, y Representación como árbol invertido así sucesivamente. La siguiente figura representa una descomposición de el diagrama o carta de organización utilizado hasta ahora en las diferentes figuras. El nodo unaEscomputadora. raíz se encuentra en la parte más alta de una jerarquía, de la que descienden ramas que van a parar aÁrbol los nodos hijos, y(computadora) así sucesivamente. La Figura 13.8 presenta esta representación para una Figura. general descomposición de una computadora. Figura a) UnFigura árbol equilibrado; b) un árbol perfectamente equilibrado Compilado13.7 Programación III 13.8 Árbol general (computadora) 41 Representación de lista Otro formato utilizado para representar un árboles es la lista entre paréntesis. Esta es la notación utilizada con expresiones algebraicas. En esta representación, cada paréntesis abierto Figura 13.8 Árbol general (computadora) Representación de lista Representación de representar lista Otro formato utilizado para un árboles es la lista entre paréntesis. Esta es tación utilizada con expresiones algebraicas. En estaes representación, cada paréntesis a Otro formato utilizado para representar árboles la lista entre paréntesis. Esta es de la un notación con paréntesis expresiones cerrado algebraicas. En esta indica el comienzo nuevo utilizada nivel y cada completa un nivel y se m paréntesis abierto indica el comienzo de un nuevo nivel hacia arribarepresentación, un nivel en cada el árbol. La notación en paréntesis correspondiente al árbol y cada paréntesis cerrado completa un nivel y se mueve hacia arriba un Figura 13.2:nivel A(B D), E, F, en (G, H, I)). en (C, el árbol. La notación paréntesis correspondiente al árbol de la Figura 13.2: A(B (C, D), E, F, (G, H, I)). Ejemplo Ejemplo 13.1 Representar el árbol general de la figura en forma de lista. Representar el árbol general de la Figura 13.9 en forma de lista. La solución es: A (B (E (K, L), F), C (G), D (H (M), I, J))). 1.2.2.5 Gráfos Figura 13.9 Árbol general La solución es: A (B (E (K, L), F), C (G), D (H (M), I, J))). Existen numerosos problemas que se pueden modelar en términos de grafos. Ejemplos concretos son: la planificación de las tareas que completan un proyecto, encon trar las rutas de menor longitud entre dos puntos geográficos, calcular el camino más rápido en un transporte o determinar el flujo máximo que puede llegar desde una fuente a una urbanización. La resolución de estos problemas requiere examinar todos los nodos y las aristas del grafo que lo representan. Los algoritmos imponen implícitamente un orden en las visitas: el nodo más próximo o las 42 Universidad de la Amazonia - Tecnología en Informática y Sistemas aristas mas cortas, y así sucesivamente; no todos los algoritmos requieren un orden concreto en el recorrido del grafo. Ordenación topológica Una de las aplicaciones de los grafos es modelar las relaciones que existen entre las diferentes tareas, hitos, que deben finalizar para dar por concluido un proyecto. Entre las tareas existen relaciones de precedencia: una tarea r precede a la tarea t si es necesario que se complete r para poder empezar t. Estas relaciones de precedencia se representan mediante un grafo dirigido en el que los vértices son las tareas o hitos y existe una arista del vértice r al t si el inicio de la tarea t depende de la terminación de r. Una vez se dispone del grafo interesa obtener una planificación de las tareas que constituyen el proyecto; en definitiva, encontrar la ordenación topológica de los vértices que forman el grafo. El grafo que representa estas relaciones de precedencia es un grafo dirigido acíclico, de tal forma que si existe un camino de u a v, entonces, en la ordenación topológica v es posterior a u. El grafo no puede tener ciclos cuando representa relaciones de precedencia; en el caso de existir, significa que si r y t son vértices del ciclo, r depende de t y a su vez t depende de la terminación de r. A tener en cuenta La ordenación topológica se aplica sobre grafos dirigidos sin ciclos. Es una ordenación lineal, tal que si v es anterior a w entonces existe un camino de v a w. La ordenación topológica no se puede realizar en grafos con ciclos. Se muestra en la siguiente figura un grafo acíclico que modela la estructura de prerrequisito de 8 cursos. Un arista cualquiera (r,s) significa que el curso r debe completarse antes de empezar el curso s. Por ejemplo, el curso M21 se puede empezar sólo cuando se terminen los cursos E11 y T12; en ese sentido, E11 y T12 son prerrequisito de M21. Una ordenación topológica de estos cursos es cualquier secuencia de cursos que cumple los requerimientos (prerrequisito). Entonces, para un grafo dirigido acíclico no tiene por qué existir una única ordenación topológica. Figura. Grafo dirigido de prerrequisito Compilado Programación III 43 Se puede comprobar que un grafo es acíclico realizando un recorrido en profundidad, de tal forma que si se encuentra un arco de retroceso en el árbol de búsqueda, el grafo tiene al menos un ciclo. Figura 16.1 Grafo dirigido de prerrequisito Del grafo de requisitos de la figura se obtienen estas ordenaciones topológicas: 16.1.1. Algoritmo topológica E11 - T12 - M21 de - C22una - R23 -ordenación S31 - S32 - T41 T12primer - E11 - R23 - C22 - M21 S31 - S32 - T41 l algoritmo, en lugar, busca un- vértice (una tarea) sin predecesores o prerrequisito s decir, no tiene arcos de entrada. Este se vértice, v, pasa a oformar parte Los de la Un grafo G dirigido y sin ciclos denomina un gda grafo acíclico. gdaordenación T; son útiles representación parciales. ordenación ontinuación, todos los para arcoslaque salen de v de sonordenaciones eliminados, debido Una a que el prerrequisito v ya parcial R en un conjunto C es una relación binaria de precedencia tal que: a satisfecho. La estrategia se repite: se toma otro vértice w sin arcos incidentes, se incorpora u ∈ C,todos u no está relacionado con síde mismo, R u es falso, por hasta complet a ordenación T- Para y se todo eliminan los arcos que salen él, asíu sucesivamente tanto, la relación R es irreflexiva. a ordenación. Si un vértice v notodou, tienev,arcos incidentes sew,expresa conRelw.grado de entrada, gradoEntrad - Para w ∈ C, siu R vyv R entoncesu La relaciónRes transitiva. )=0. Eliminar los arcos que salen de v implica que gradoEntrada(w) de todos los vértic adyacentes de disminuye en 1C. se llama ordenación parcial de C. La relación de Talvrelación R sobre inclusiónelen conjuntos comienza es un ejemplo de ordenación parcial. grafo Gde sincada vértice d Por consiguiente, algoritmo calculando el grado deUn entrada ciclos se puede considerar un conjunto parcialmente ordenado. rafo. Los vértices cuyo grado de entrada es 0 se guardan en una Cola. El elemento frente Nota Se puede comprobar que un grafo es acíclico realizando un recorrido en profundidad, de tal forma que si se encuentra un arco de retroceso en el árbol de búsqueda, el grafo tiene al menos un ciclo. 44 Universidad de la Amazonia - Tecnología en Informática y Sistemas Para complementar… 1. Aprender estructuras de datos por medio de los mapas conceptuales El artículo muestra el avance de un proyecto que da las herramientas a los estudiantes para recorrer y conectar las estructuras, posibilitando la construcción del conocimiento global de las mismas, lo que permite una visión de ocnjunto entre ellas y al mismo tiempo resalta las particularidades de cada estructura. Disponible en: http://sedici.unlp.edu.ar/bitstream/handle/10915/22924/Documento_co mpleto.pdf?sequence=1 2. Experiencia de aprender estructura de datos a través de un campus virtual Disponible en: http://eprints.ucm.es/7799/1/campusvirtual156-173.pdf Compilado Programación III 45 2. REFERENCIAS - - - - 46 Joyanes Aguilar, L., & Zahonero Martínez , I. (2008). Estructuras de datos en Java. (MCGRAW-HILL, Ed.) España. Benitez López, T. (s.f.). Estructura de Datos I. (U. d. Occidente, Productor) Obtenido de Estructura de Datos I: http://fcc98.tripod.com/tutores/ed1/ed1.html DATOS-APUNTES, E. D. (s.f.). Obtenido de http://upload.wikimedia.org/wikipedia/commons/5/51/APUNTES. pdf Disco Duro. (s.f.). Obtenido de http://www.discoduroderoer.es/ejercicios-propuestos-y-resueltosarrays-de-java/# Ejemplos en java. (s.f.). Obtenido de http://programacionparajava.blogspot.com/p/programas-sencillosusando-estructura.html Universidad de la Amazonia - Tecnología en Informática y Sistemas