Está en la página 1de 25

Estructuras de Datos

Unidad 1: Introduccin a las estructuras de datos


Contenido
1.1 Tipos de datos abstractos (TDA). ............................................................... 2
1.2 Modularidad. ............................................................................................. 9
1.3 Uso de TDA. ............................................................................................. 12
1.4 Manejo de memoria esttica. .................................................................. 14
Arreglos Unidimensionales......................................................................... 15
Arreglos Bidimensionales ........................................................................... 18
1.5 Manejo de memoria dinmica ................................................................. 24

1.1 Tipos de datos abstractos (TDA).


Qu es una abstraccin?
En trminos simples, una abstraccin es un proceso mental, mediante el cual se extraen
los rasgos esenciales de algo para representarlos por medio de un lenguaje grfico o
escrito.
Por qu es importante la abstraccin?
La capacidad de modelar una realidad por medio de herramientas computacionales
requiere necesariamente de hacer continuas abstracciones, por lo que es vital conocer
metodologas que desarrollen esta habilidad.
Qu es la abstraccin de Datos?
Es una tcnica o metodologa que permite disear estructuras de datos. Consiste,
bsicamente, en representar bajo ciertos lineamientos de formatos las caractersticas
esenciales de una estructura de Datos. Este proceso de diseo se olvida de los detalles
especficos e implementacin de los datos, razn por la cual se trata de abstraccin.
Qu es una Estructura de Datos?
Cualquier coleccin o grupo organizado de datos, de tal forma que tengan asociados un
conjunto de operaciones para poder manipularlos.
Qu es un tipo de dato abstracto?
La tcnica de abstraccin de datos establece que al disear una nueva estructura de
datos, sta pasa a ser un Tipo de Dato Abstracto (TAD), que podr implementarse en
cualquier lenguaje y aplicarse en cualquier concepto.
Un tipo de dato abstracto (TDA) o Tipo abstracto de datos (TAD) es un modelo
matemtico compuesto por una coleccin de operaciones definidas sobre un conjunto de
datos para el modelo.
En el mundo de la programacin existen diversos lenguajes que se han ido creando con el
paso del tiempo y que se han perfeccionado debido a las necesidades de los
programadores de la poca a la que pertenecen. Los primeros lenguajes de programacin
eran de tipo lineal, ya que un programa se recorra desde un punto marcado como Inicio
hasta llegar a un punto Fin. Con el tiempo se fueron creando nuevos lenguajes y en
nuestros das los ms utilizados son los llamados Orientados a Objetos.

Los Lenguajes Orientados a Objetos (LOO) tienen la caracterstica de que no son lenguajes
lineales, sino que se forman de diversas funciones, las cuales son llamadas en el orden en
que el programa mismo las pide o el usuario determina. Para entender mejor cmo
funcionan los Lenguajes Orientados a Objetos, vamos a introducir un concepto
fundamental en las Estructuras de Datos denominado Abstraccin de Datos y que es parte
importante de estos Lenguajes y de la manera en que funciona la mayora del software
comercial de nuestros das.
El concepto de tipo de dato abstracto (TDA, Abstract Data Type), fue propuesto por
primera vez hacia 1974 por John Guttag y otros, pero no fue hasta 1975 que por primera
vez Liskov lo propuso para el lenguaje CLU.
El lenguaje Turbo Pascal fue determinante para la comn aceptacin de los TDAs con la
introduccin de las Units, si bien estas no cumplen con las caractersticas bsicas de un
Tipo de dato Abstracto como por ejemplo la encapsulacin de los datos. El lenguaje Ada
pudo implementar exitosamente los TDAs con sus Packages. Vale recordar que estos dos
ltimos lenguajes soportan formalmente la Programacin modular.

Definicin
Con mucha frecuencia se utilizan los trminos TDA y Abstraccin de Datos de manera
equivalente, y esto es debido a la similitud e interdependencia de ambos. Sin embargo, es
importante definir por separado los dos conceptos.
Como ya se mencion, los Lenguajes de Programacin Orientados a Objetos son lenguajes
formados por diferentes mtodos o funciones y que son llamados en el orden en que el
programa lo requiere, o el usuario lo desea. La abstraccin de datos consiste en ocultar las
caractersticas de un objeto y obviarlas, de manera que solamente utilizamos el nombre
del objeto en nuestro programa. Esto es similar a una situacin de la vida cotidiana.
Cuando yo digo la palabra perro, usted no necesita que yo le diga lo que hace el perro.
Usted ya sabe la forma que tiene un perro y tambin sabe que los perros ladran. De
manera que yo abstraigo todas las caractersticas de todos los perros en un solo trmino,
al cual llamo perro. A esto se le llama Abstraccin y es un concepto muy til en la
programacin, ya que un usuario no necesita mencionar todas las caractersticas y
funciones de un objeto cada vez que ste se utiliza, sino que son declaradas por separado
en el programa y simplemente se utiliza el trmino abstracto (perro) para mencionarlo.
En el ejemplo anterior, perro es un Tipo de Dato Abstracto y todo el proceso de
definirlo, implementarlo y mencionarlo es a lo que llamamos Abstraccin de Datos.

Vamos a poner un ejemplo real de la programacin. Supongamos que en algn Lenguaje


de Programacin Orientado a Objetos un pequeo programa saca el rea de un rectngulo
de las dimensiones que un usuario decida. Pensemos tambin que el usuario
probablemente quiera saber el rea de varios rectngulos. Sera muy tedioso para el
programador definir la multiplicacin de base por altura varias veces en el programa,
adems que limitara al usuario a sacar un nmero determinado de reas. Por ello, el
programador puede crear una funcin denominada rea, la cual va a ser llamada el
nmero de veces que sean necesitadas por el usuario y as el programador se evita mucho
trabajo, el programa resulta ms rpido, ms eficiente y de menor longitud. Para lograr
esto, se crea el mtodo rea de una manera separada de la interfaz grfica presentada al
usuario y se estipula ah la operacin a realizar, devolviendo el valor de la multiplicacin.
En el mtodo principal solamente se llama a la funcin rea y el programa hace el resto.
Al hecho de guardar todas las caractersticas y habilidades de un objeto por separado se le
llama Encapsulamiento y es tambin un concepto importante para entender la
estructuracin de datos. Es frecuente que el Encapsulamiento sea usado como un
sinnimo del Ocultacin de informacin, aunque algunos creen que no es as.
Separacin de la interfaz e implementacin
Cuando se usa en un programa de computacin, un TDA es representado por su interfaz,
la cual sirve como cubierta a la correspondiente implementacin. La idea es que los
usuarios de un TDA tengan que preocuparse slo por la interfaz, pero no por la
implementacin, ya que esta puede ir cambiando con el tiempo y, si no existiera
encapsulacin, afectar a los programas que usan el dato. Esto se basa en el concepto de
Ocultacin de informacin, una proteccin para el programa de decisiones de diseo que
son objeto de cambio.
La solidez de un TDA reposa en la idea de que la implementacin est escondida al
usuario. Solo la interfaz es pblica. Esto significa que el TDA puede ser implementado de
diferentes formas, pero mientras se mantenga consistente con la interfaz, los programas
que lo usan no se ven afectados.
Hay una diferencia, aunque a veces sutil, entre el Tipo de Dato Abstracto y la Estructura de
Dato usada en su implementacin. Por ejemplo, un TDA de una lista puede ser
implementado mediante un Arreglo o una Lista Enlazada o hasta un rbol binario de
bsqueda. Una lista es un Tipo de Dato Abstracto con operaciones bien definidas (agregar
elemento, agregar al final, agregar al principio, recuperar, eliminar, etc) mientras una lista
enlazada es una estructura de datos basada en punteros o referencias (dependiendo del
lenguaje) que puede ser usada para crear una representacin de una Lista. La Lista

Enlazada es comnmente usada para representar una TDA Lista, y a veces, hasta
confundida. Un ejemplo es la clase Linked List de Java, la cual ofrece una gran cantidad de
mtodos que no corresponden a una Lista Enlazada "pura", sino a un fuerte TDA.
De forma similar, un TDA rbol binario de bsqueda puede ser representado de muchas
maneras: rbol binario, rbol AVL, rbol rojo-negro, Arreglo, etc. A pesar de la
implementacin un rbol binario siempre tiene las mismas operaciones (insertar,
eliminar, encontrar, etc.)
Separar la interfaz de la implementacin no siempre significa que el usuario ignora
totalmente la implementacin de la rutina, pero lo suficiente para no depender de ningn
aspecto de la implementacin. Por ejemplo, un TDA puede ser creado usando un script o
cualquiera que pueda ser decompilado (como C).
En la terminologa de Lenguaje Orientado a Objeto, un TDA es una clase; una instancia de
un TDA o clase, es un objeto. Adems es utilizado constantemente por programadores de
computadoras.
Caracterizacin
Un TDA est caracterizado por un conjunto de operaciones (funciones) al cual se
denomina usualmente como interfaz pblica y representa el comportamiento del TDA;
mientras que la implementacin como la parte privada del TDA est oculta al programa
cliente que lo usa. Todos los lenguajes de alto nivel tienen predefinidos TDA; que son los
tipos denominados simples y las estructuras predefinidas, y estos tienen sus interfaces
pblicas que incluyen las operaciones como la +, -, *, etc. no se necesita conocer como
actan tales operadores sobre la representacin interna de los tipos definidos, que
adems, suele ser una implementacin bastante dependiente de la mquina sobre la que
trabaje el compilador. Lo interesante es que los lenguajes actuales nos van a permitir
ampliar los TDA predefinidos con otros que sern definidos por el propio programador
para adecuar as los tipos de datos a las necesidades de los programas.
Los TDA que nos van a interesar de ahora en adelante son aquellos que reflejen cierto
comportamiento organizando cierta variedad de datos estructuradamente. A esta forma
estructurada de almacenar los datos ser a la que nos refiramos para caracterizar cada
TDA.
Los TDA que tienen informaciones simples pero dependientes de un comportamiento
estructural sern llamados polilticos y aquellos TDA simples, como son los tipos
predefinidos donde la informacin no es relacionada mediante ninguna estructura y no
admiten ms que un valor en cada momento sern denominados TDA monolticos.

Ntese que cuando hablemos de un TDA no haremos ninguna alusin al tipo de los
elementos sino tan slo a la forma en que estn dispuestos estos elementos. Slo nos
interesa la estructura que soporta la informacin y sus operaciones. Para determinar el
comportamiento estructural basta con observar la conducta que seguirn los datos.
Caractericemos entonces los TDA. Un TDA tendr una parte que ser invisible al usuario la
cual hay que proteger y que se puede decir que es irrelevante para el uso del usuario y
est constituida tanto por la maquinaria algortmica que implemente la semntica de las
operaciones como por los datos que sirvan de enlace entre los elementos del TDA, es
decir, informacin interna necesaria para la implementacin que se est haciendo para
ese comportamiento del TDA. Resumiendo podemos decir, que tanto la implementacin
de las operaciones como los elementos internos del TDA sern privados al acceso externo
y ocultos a cualquier otro nivel.
Un TDA representa una abstraccin:

Se destacan los detalles (normalmente pocos) de la especificacin (el qu).

Se ocultan los detalles (casi siempre numerosos) de la implementacin (el cmo).

La abstraccin
La abstraccin, una de las herramientas que ms nos ayuda a la hora de solucionar un
problema, es un mecanismo fundamental para la comprensin de problemas y fenmenos
que poseen una gran cantidad de detalles, su idea principal consiste en manejar un
problema, fenmeno, objeto, tema o idea como un concepto general, sin considerar la
gran cantidad de detalles que estos puedan tener. El proceso de abstraccin presenta dos
aspectos complementarios.
1. Destacar los aspectos relevantes del objeto.
2. Ignorar los aspectos irrelevantes del mismo (la irrelevancia depende del nivel de
abstraccin, ya que si se pasa a niveles ms concretos, es posible que ciertos
aspectos pasen a ser relevantes).
De modo general podemos decir que la abstraccin permite establecer un nivel jerrquico
en el estudio de los fenmenos, el cual se establece por niveles sucesivos de detalles.
Generalmente, se sigue un sentido descendente de detalles, desde los niveles ms
generales a los niveles ms concretos.
Por ejemplo: los lenguajes de programacin de alto nivel permiten al programador
abstraerse del sin fin de detalles de los lenguajes ensambladores. Otro ejemplo, la

memoria de la computadora es una estructura unidimensional formada por celdas y sin


embargo trabajamos como si fuera nica. La abstraccin nos brinda la posibilidad de ir
definiendo una serie de refinamientos sucesivos a nuestro TDA y entindase bien que
cuando decimos refinamientos sucesivos nos estamos refiriendo a la estrategia que se
utiliza para descomponer un problema en subproblemas. Conforme evoluciona el diseo
de software a cada nivel de mdulos se representa un refinamiento en el nivel de
abstraccin. Esto es, incluir detalles que fueron obviados en un nivel superior, en un nivel
ms bajo de la jerarqua.
Veamos los diferentes tipos de abstraccin que podemos encontrar en un programa:
1. Abstraccin funcional: crear procedimientos y funciones e invocarlos mediante un
nombre donde se destaca qu hace la funcin y se ignora cmo lo hace. El usuario slo
necesita conocer la especificacin de la abstraccin (el qu) y puede ignorar el resto de los
detalles (el cmo).
2. Abstraccin de datos:

Tipo de datos: proporcionado por los leguajes de alto nivel. La representacin


usada es invisible al programador, al cual solo se le permite ver las operaciones
predefinidas para cada tipo.

Tipos definidos: por el programador que posibilitan la definicin de valores de


datos ms cercanos al problema que se pretende resolver.

TDA: para la definicin y representacin de tipos de datos (valores + operaciones),


junto con sus propiedades.

Objetos: Son TDA a los que se aade propiedades de reutilizacin y de


comparticin de cdigo.

Si profundizamos ms al mundo de la programacin y sus conceptos, existen dos de estos


conceptos que no se deben confundir, ellos son: tipo de datos y estructura de datos.
Un tipo de dato, en un lenguaje de programacin, define un conjunto de valores que una
determinada variable puede tomar, as como las operaciones bsicas sobre dicho
conjunto. Ahora veamos cmo se van relacionando estos conceptos. Los tipos de datos
constituyen un primer nivel de abstraccin, ya que no se tiene en cuenta cmo se
implementan o se representan realmente la informacin sobre la memoria de la mquina.
Para el usuario, el proceso de implementacin o representacin es invisible.

Veamos entonces que son las estructuras de datos. Las estructuras de datos son
colecciones de variables, no necesariamente del mismo tipo, relacionadas entre s de
alguna forma. Las estructuras de datos estn caracterizadas por el tipo de dato de los
elementos guardados en la estructura y por la relacin definida sobre estos elementos.
Al nivel de las estructuras de datos son totalmente irrelevantes las operaciones sobre un
elemento en particular, solamente tienen carcter relevante las operaciones que
envuelvan la estructura de forma global.
La abstraccin de datos es la caracterstica de un sistema de bases de datos, que permite
al usuario o programador operar con los datos sin necesidad de conocer detalles que para
l no son de importancia, ofreciendo as una visin abstracta de estos. Para cumplir con
tal fin se han definido diferentes niveles de abstraccin:

Nivel Fsico. Determina como estn almacenados fsicamente los datos (pistas,
sectores, cilindros), representa el nivel ms bajo.

Nivel Lgico o Conceptual. Determina la organizacin de los archivos. ndices,


llaves, orden de campos, relaciones, tipos de datos.

Nivel de Vistas. Oculta parte de la informacin a los usuarios, es decir hace visible
solo una parte de la base de datos.

Ejemplos de uso de TDAs


Algunos ejemplos del uso de TDAs en programacin son:

Conjuntos: Implementacin de conjuntos con sus operaciones bsicas (unin,


interseccin y diferencia), operaciones de insercin, borrado, bsqueda...

rboles Binarios de Bsqueda: Implementacin de rboles de elementos,


utilizados para la representacin interna de datos complejos. Aunque siempre se
los toma como un TDA separado son parte de la familia de los grafos.

Pilas y Colas: Implementacin de los algoritmos FIFO y LIFO.

Grafos: Implementacin de grafos; una serie de vrtices unidos mediante una serie
de arcos o aristas.

1.2 Modularidad.
La modularidad es el proceso en el cual se descompone un programa en un pequeo
nmero de abstracciones independientes unas de otras pero fciles de conectarse entre
s. Un mdulo se caracteriza principalmente por su interfaz y su implementacin. La
programacin modular sigue el criterio de ocultacin de informacin: Si no se necesita
algn tipo de informacin, no se debe tener acceso a ella.
La modularidad es un aspecto muy importante en los TDA, ya que es el reflejo de la
independencia de la especificacin y la implementacin.
La programacin modular ofrece otras ventajas como por ejemplo un mejor reparte del
trabajo y una deteccin de fallos mucho mejor.

Figura 1. Ejemplo de modularidad.

Por qu modular?

Reduce la complejidad de las situaciones problemticas.


Evita cdigo duplicado.
Mejora la organizacin.
Resulta fcil la lectura y compresin del cdigo.
Crea puntos de control centralizados.
Permite la reutilizacin de cdigo

La modularidad es la capacidad que tiene un sistema de ser estudiado, visto o entendido


como la unin de varias partes que interactan entre s y que trabajan para alcanzar un
objetivo comn, realizando cada una de ellas una tarea necesaria para la consecucin de
dicho objetivo. Cada una de esas partes en que se encuentre dividido el sistema recibe el
nombre de mdulo. Idealmente un mdulo debe poder cumplir las condiciones de caja
negra, es decir, ser independiente del resto de los mdulos y comunicarse con ellos (con
todos o slo con una parte) a travs de unas entradas y salidas bien definidas.
Modularidad en computacin es la caracterstica por la cual un programa de computador
est compuesto de porciones que se conocen como mdulos. El diseo estructurado es la
tcnica de diseo de algoritmos en que se basa la programacin modular, paradigma de
programacin que persigue desarrollar programas modulares
En programacin modular, y ms especficamente en programacin orientada a objetos,
se denomina Modularidad a la propiedad que permite subdividir una aplicacin en partes
ms pequeas (llamadas mdulos), cada una de las cuales debe ser tan independiente
como sea posible de la aplicacin en s y de las restantes partes.
Estos mdulos que se puedan compilar por separado, pero que tienen conexiones con
otros mdulos. Al igual que la encapsulacin, los lenguajes soportan la Modularidad de
diversas formas.
Segn Bertrand Meyer "El acto de particionar un programa en componentes individuales
para reducir su complejidad en algn grado. . . . A pesar de particionar un programa es til
por esta razn, una justificacin ms poderosa para particionar un programa es que crea
una serie de lmites bien definidos y documentados en el programa. Estos lmites, o
interfaces, son muy valiosos en la comprensin del programa".
Por su parte Brbara Liskov establece que "modularizacin consiste en dividir un
programa en mdulos que pueden ser compilados de forma separada, pero que tienen
conexiones con otros mdulos".
Programa modular: formado por un conjunto de mdulos.
Mdulo: unidad bsica de descomposicin de un sistema software. Los mdulos deben
ser lo ms independientes posibles.
Un mtodo de construccin de software es modular si ayuda a producir sistemas software
a partir de elementos autnomos interconectados por una estructura simple y coherente.

La programacin modular trata de descomponer un programa en un pequeo nmero de


abstracciones coherentes que pertenecen al dominio del problema y cuya complejidad
interna esta oculta por el interfaz.
Un mdulo se estructura mediante una interfaz y una implementacin.
Est compuesto por un conjunto de operaciones y atributos.

Reglas para obtener mdulos:


Unidades modulares:
El lenguaje debe proporcionar estructuras modulares con las cuales se puedan
describir las diferentes unidades.
POO Clases.
Ocultacin de informacin:
Todos los mdulos deben seguir el principio de ocultacin de informacin.
Una abstraccin de datos puede verse como que tiene dos caras:
o Interfaz: operaciones que definen el comportamiento (cliente)
o Implementacin (programador)

1.3 Uso de TDA.


Se utilizan los TDA para resolver aplicaciones. Su uso se limita a llamar a las operaciones
sobre la estructura que se requiera cuidando siempre de cumplir las reglas de cada
operacin.
Ventajas de utilizar la tcnica de Abstraccin de Datos.
Se tiene una implementacin ms clara, documentable y fcil de darle
mantenimiento.
Debido a la independencia de datos, se puede crear paquetes como unidades de
software reutilizable, con lo que se obtienen Estructuras de Datos genricas.
Facilita y hace ms rpido el desarrollo de aplicaciones.
Podemos crear unidades de software utilizable.
Es uno de los principales fundamentos de la Programacin Orientada a Objetos.

Usar el TDA permite aprovechar el nivel de abstraccin en el desarrollo de un problema.


Por ejemplo: Resolver el problema de verificacin si la suma y multiplicacin de 2 nmeros
complejos producen el mismo nmero complejo.
Solucin en pseudo lenguaje:

INICIO // Programa principal


X, Y COMPLEJO
A Booleano
X = CREAR_COMPLEJO(3,-5)
Y = CREAR_COMPLEJO(8,-3
)A = VERIFICAR1(X,Y)
Si A = verdadero entonces imprimir Son iguales la suma y lamultiplicacin
Sino imprimir NO son iguales la suma y la multiplicacin
Fsi
FIN
funcin VERIFICAR1 (X,Y: COMPLEJO): Booleano // Funcin Verificar1
Z1,Z2 COMPLEJO
Z1 = SUMAR (X,Y)
Z2 = MULTIPLICAR (X,Y)
RETORNAR IGUAL (Z1,Z2)

f.funcin
funcin VERIFICAR2 (X,Y: COMPLEJO): Booleano // Funcin Verificar2
RETORNAR IGUAL (SUMAR (X,Y), MULTIPLICAR (X,Y) )
f.funcin

Se provee al lector de otra versin funcin VERIFICAR2 que realiza la misma operacin
sobre los nmeros complejos. Note que VERIFICAR1 no es una operacin del TDA
Ventajas de uso de un TDA

Herramienta para resolver problemas (nivel de abstraccin)


Independencia entre la forma de representar la informacin y la solucin del
problema portabilidad de la solucin.
Favorece la especificacin, verificacin y depuracin de programas.
Contribuye a la flexibilidad de los cambios.

1.4 Manejo de memoria esttica.


La memoria esttica es la que se reserva al momento de compilacin antes de comenzar a
ejecutarse el programa. Los objetos son creados en ese momento y destruidos al final del
programa. Mantiene la misma de localizacin en memoria durante todo el transcurso del
programa.
La forma ms fcil de almacenar el contenido de una variable en memoria en tiempo de
ejecucin es en memoria esttica o permanente a lo largo de toda la ejecucin del
programa. No todos los objetos (variables) pueden ser almacenados estticamente.
Para que un objeto pueda ser almacenado en memoria esttica su tamao (nmero de
bytes necesarios para su almacenamiento) ha de ser conocido en tiempo de compilacin,
como consecuencia de esta condicin no podrn almacenarse en memoria esttica:

Los objetos correspondientes a procedimientos o funciones recursivas, ya que


entiempo de compilacin no se sabe el nmero de variables que sern necesarias.
Las estructuras dinmicas de datos tales como listas, rboles, etc. ya que el
nmero de elementos que las forman no es conocido hasta que el programa se
ejecuta.

Las tcnicas de asignacin de memoria esttica son sencillas. A partir de una posicin
sealada por un puntero de referencia se aloja el objeto X, y se avanza el puntero tantos
bytes como sean necesarios para almacenar el objeto X. La asignacin de memoria puede
hacerse en tiempo de compilacin y los objetos estn vigentes desde que comienza la
ejecucin del programa hasta que termina. En los lenguajes que permiten la existencia de
subprogramas, y siempre que todos los objetos de estos subprogramas puedan
almacenarse estticamente se aloja en la memoria esttica un registro de activacin
correspondiente a cada uno de los subprogramas. Estos registros de activacin
contendrn las variables locales, parmetros formales y valor devuelto por la funcin.
Dentro de cada registro de activacin las variables locales se organizan secuencialmente.
Existe un solo registro de activacin para cada procedimiento y por tanto no estn
permitidas las llamadas recursivas.
Para el manejo de memoria esttica se utilizan estructuras de datos cuyo tamao es
definido en tiempo de compilacin es decir el tamao est definido en el programa y no
puede incrementarse o decrementarse, existen diferentes tipos de estructuras las ms
populares son:

Arreglos
Es un grupo de posiciones en memoria relacionadas entre s.
Definicin: Coleccin finita, homognea y ordenada de elementos.
Finita: Porque todo arreglo tiene un lmite.
Homognea: Porque todos los elementos son del mismo tipo.
Ordenada: Porque se puede determinar cul es el ensimo elemento.
Un arreglo tiene dos partes: Componentes e ndices

C1 C2 .... Cn
i0 i1
in
Figura 2. Ejemplo de Arreglo Unidimensional.
Componentes: Hacen referencia a los elementos que forman el arreglo.
ndices: Permiten referirse a los componentes del arreglo en forma individual.
En java, un ndice del arreglo es siempre un entero que comienza en cero y termina en:
tamao 1.

Arreglos Unidimensionales
Son los arreglos ms simples y constan de un solo ndice, tambin se llaman vectores.
Notacin: Podra ser de diferentes maneras. Por ejemplo:
Array [0...9] de enteros: Vector
Vector: x

C
o
m
po
ne
nt
es

n
14 43
di
x0
ce
s

x1
x9

Figura 3. Arreglo Unidimensional v.1

X hace referencia a todo el vector, mientras que x0, o x1 hace referencia a los elementos
en forma individual.
Los arreglos se almacenan en forma adyacente, as que su representacin en memoria es:
X0 , Direccin z; X1 ,Direccin z+1; Xn ,Direccin z+n
Cada elemento del arreglo se puede procesar como si fuera una variable simple. Ejemplo:
Suma
X [2]
i

Suma + X[2]
15

X[i]
X [i+2]

15
15

(Los ndices en Java siempre estn encerrados entre corchetes)

Sobre los vectores se pueden realizar las siguientes operaciones:


Lectura/Escritura, Asignacin, Actualizacin (insertar, eliminar, modificar), Ordenamiento
y Bsqueda.
Creacin de un arreglo o vector unidimensional (cdigo fuente).
Programa que crea e inicializa un vector de 10 elementos de tipo entero para despus
imprimir su salida en pantalla.
mi_arreglo.java
public class mi_arreglo {
public static void main (String [] args) {
//crear la variable i que servir como indice del arreglo
int i;
//creacin e inicializacin de mi_arreglo con 10 elementos de tipo entero
int mi_arreglo[] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
//obtener la longitud del arreglo e imprimirla
System.out.println("Arreglo de longitud: " + mi_arreglo.length);
//imprime un linea vacia para dejar un renglon en blanco
System.out.println();
//ciclo para obtener la longitud y generar indices
for (i = 0; i < mi_arreglo.length; i++) {
//impresion de indice y valor almacenado en cada posicion recorrida
System.out.println("Indice: " + i + "
}
}
}

valor: " + mi_arreglo[i] );

Arreglos Bidimensionales
Tambin conocidas tablas de valores y constan de informacin o componentes dispuestas
en filas y columnas. Estos arreglos constan de dos ndices, tambin se llaman matrices.
Para identificar un componente o elemento de una tabla concreta se deben especificar los
dos subndices (por convenio, el primero identifica la fila del elemento y el segundo
identifica la columna del elemento).
Notacin: Podra ser de diferentes maneras. Por ejemplo:
Array [0...2, 0...2] de enteros: Matriz
Matriz: M

C
o
43 90
m
C In
po
0o 1 di
2
ne
m ce
nt
po s
es
ne
nt
es

n
di
ce
83
s

34
2

41
56

Figura 4. Ilustra un arreglo de doble ndice, que contiene tres filas y tres columnas.

Operaciones:
Lectura, Escritura, Asignacin.
Creacin de un arreglo o vector bidimensional.
Crea e inicializa un arreglo bidimensional de 3 x 3 con componentes de tipo entero, e
imprime su salida en pantalla.
mi_arreglo2.java
public class mi_arreglo2 {
public static void main (String [] args) {
int filas, columnas;
int i, j; //variables que serviran como indices del arreglo
int mi_arreglo2[][] = {{1, 2, 3}, //arreglo de 3 filas por 3 columnas
{4, 5, 6}, //asignando 9 elementos de tipo entero
{7, 8, 9}};
//simple cadena como encabezado
System.out.println("#############... RESULTADOS ...#############");
//imprime un linea vacia para dejar un renglon en blanco
System.out.println();
//ciclo para obtener numero de filas
for (i = 0; i < mi_arreglo2.length; i++) {
filas = mi_arreglo2.length;
//ciclo para obtener numero de columnas en cada fila
for (j = 0; j < mi_arreglo2[i].length; j++) {
columnas = mi_arreglo2[i].length;
//impresion de los elementos almacenados en las posiciones dadas por los
indices i y j de la tabla

System.out.println("Indice: " + i + "," + j +" (fila " + (i+1) + ", columna "
+ (j+1) + ") valor: " + mi_arreglo2[i][j] );
//impresion de indice y valor almacenado
}
}
}
}

Registros (Estructuras)
Un registro es una coleccin de datos, que pueden ser de diferentes tipos. Cada uno de
sus elementos se llama Campo.
Notacin: Podra ser de diferentes maneras. Por ejemplo:
Tipo registro: Domicilio
Entero: Calle
Entero: Numero
Cadena: Ciudad
Fin Tipo
Domicilio: dir

1
750

3
Figura 5. Ejemplo de Registro.

El acceso a los campos se hace as: variable_registro.id_campo.


Por Ejemplo: dir.Calle, dir.Numero, dir.Ciudad.

Arreglos y Registros
Se pueden presentar las siguientes combinaciones:
I. Arreglos de Registros: Cada elemento del registro es un arreglo.
Tipo registro: Cliente
Cadena: Nombre
Cadena: Telfono
Real: Saldo
Fin Tipo
Array [0...2] de Cliente: Vector
Notacin:
Vector[0].Nombre

Figura 6. Ejemplo de un Arreglo de Registros.

II.

Registro Anidado: Por lo menos un campo del registro es de tipo registro.

Tipo registro: Domicilio


Entero: Calle
Entero: Numero
Cadena: Ciudad
Fin Tipo
Tipo registro: Cliente
Cadena: Nombre
Domicilio: Direccin
Real: Saldo
Fin Tipo

Notacin:
Cliente.Nombre
Cliente.Direccin.Calle

T
N12

S N
T S

Figura 7. Ejemplo de Registro anidado.

Cliente

III.

Registro con Arreglos: Por lo menos un campo del registro es un arreglo..

Array [0...2] de Real:Vector


Tipo registro: Estudiante
Cadena: Nombre
Cadena: Cdigo
Vector: Notas
Fin Tipo

Notacin:
Estudiante.Nombre
Estudiante. Notas[0]

Direccin

Ciu

Nombr
e
Figura 8. Registro con Arreglos.

Cll

Num

1.5 Manejo de memoria dinmica


Datos estticos: su tamao y forma es constante durante la ejecucin de un programa y
por tanto se determinan en tiempo de compilacin. El ejemplo tpico son los arreglos.
Tienen el problema de que hay que dimensionar la estructura de antemano, lo que puede
conllevar desperdicio o falta de memoria.
Datos dinmicos: su tamao y forma es variable (o puede serlo) a lo largo de un
programa, por lo que se crean y destruyen en tiempo de ejecucin. Esto permite
dimensionar la estructura de datos de una forma precisa: se va asignando memoria en
tiempo de ejecucin segn se va necesitando.
Cuando el sistema operativo carga un programa para ejecutarlo y lo convierte en proceso,
le asigna cuatro partes lgicas en memoria principal: texto, datos (estticos), pila y una
zona libre. Esta zona libre (o heap) es la que va a contener los datos dinmicos, la cual, a
su vez, en cada instante de la ejecucin tendr partes asignadas a los mismos y partes
libres que fragmentarn esta zona, siendo posible que se agote si no se liberan las partes
utilizadas ya inservibles. (La pila tambin vara su tamao dinmicamente, pero la gestiona
el sistema operativo, no el programador):
Para trabajar con datos dinmicos necesitamos dos cosas:
1. Subprogramas predefinidos en el lenguaje que nos permitan gestionar la memoria
de forma dinmica (asignacin y liberacin).
2. Algn tipo de dato con el que podamos acceder a esos datos dinmicos (ya que
con los tipos vistos hasta ahora slo podemos acceder a datos con un tamao y
forma ya determinados).
Las variables de tipo puntero son las que nos permiten referenciar datos dinmicos.
Tenemos que diferenciar claramente entre:
1. la variable referencia o apuntadora, de tipo puntero;
2. la variable annima referenciada o apuntada, de cualquier tipo, tipo que estar
asociado siempre al puntero.
Fsicamente, un puntero no es ms que una direccin de memoria.

En el siguiente ejemplo se muestra el contenido de la memoria con un puntero que


apunta a la direccin 78 AC (16, la cual contiene 6677(16:

Qu es la memoria dinmica? Supongamos que nuestro programa debe manipular


estructuras de datos de longitud desconocida. Un ejemplo simple podra ser el de un
programa que lee las lneas de un archivo y las ordena. Por tanto, deberemos leer un
nmero indeterminado de lneas, y tras leer la ltima, ordenarlas. Una manera de manejar
ese ``nmero indeterminado'', sera declarar una constante MAX_LINEAS, darle un valor
vergonzosamente grande, y declarar un arreglo de tamao MAX_LINEAS. Esto,
obviamente, es muy ineficiente (y feo). Nuestro programa no slo quedara limitado por
ese valor mximo, sino que adems gastara esa enorme cantidad de memoria para
procesar hasta el ms pequeo de los archivos. La solucin consiste en utilizar memoria
dinmica. La memoria dinmica es un espacio de almacenamiento que se solicita en
tiempo de ejecucin. De esa manera, a medida que el proceso va necesitando espacio
para ms lneas, va solicitando ms memoria al sistema operativo para guardarlas. El
medio para manejarla memoria que otorga el sistema operativo, es el puntero, puesto
que no podemos saber en tiempo de compilacin dnde nos dar huecos el sistema
operativo (en la memoria de nuestra computadora).