Download Compilado Programacion III Estructura de Datos

Document related concepts

Array dinámico wikipedia , lookup

Rango (informática) wikipedia , lookup

Vector (informática) wikipedia , lookup

Árbol binario indexado wikipedia , lookup

Tabla hash wikipedia , lookup

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
[email protected]
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