Beruflich Dokumente
Kultur Dokumente
MATERIA
SEMINARIO DE PROGRAMACIÓN DE
COMPUTADORAS
ASESOR
ALUMNA
ACTIVIDAD #4
ESTRUCTURAS DE DATOS
Las estructuras de datos son un medio para manejar grandes cantidades de datos de
manera eficiente para usos tales como grandes bases de datos y servicios de indización
de Internet. Por lo general, las estructuras de datos eficientes son la clave para diseñar
algoritmos eficientes. Algunos métodos formales de diseño y lenguajes de programación
destacan las estructuras de datos, en lugar de los algoritmos, como el factor clave de
organización en el diseño de software. Las estructuras de datos se basan generalmente
en la capacidad de una computadora para recuperar y almacenar datos en cualquier lugar
de su memoria.
Las estructuras de datos estáticas son aquellas en las que el tamaño ocupado en memoria
se define antes de que el programa se ejecute y no puede modificarse dicho tamaño
durante la ejecución del programa.
Los tipos de datos simples tienen como característica común que cada variable representa
a un elemento.
Los tipos de datos estructurados tienen como característica común que un identificador
(nombre) puede representar múltiples datos individuales, pudiendo cada uno de éstos ser
referenciado independientemente.
Arreglos,
Matrices,
Pilas,
Colas
Listas
ARREGLOS
Un arreglo (matriz o vector) es un conjunto finito y ordenado de elementos homogéneos.
La propiedad “ordenado” significa que el elemento primero, segundo, tercero,…, enésimo
de un arreglo puede ser identificado. Los elementos de un arreglo son homogéneos, es
decir, del mismo tipo de dato.
Cada componente de un arreglo se denota, explícitamente, y es accedida, directamente,
mencionando el nombre del arreglo seguido de una expresión encerrada entre paréntesis,
a la que llamamos índice del arreglo.
El índice del arreglo toma valores entre uno y la dimensión del mismo. Si se direcciona una
posición que no se encuentra entre dichos límites, se producirá un error de ejecución, pues
se estará intentando acceder a una zona de memoria indefinida (pues el vector está
definido entre las posiciones 1 y dimensión).
A un arreglo lineal se lo denomina unidimensional, y se utiliza un solo índice para denotar
sus elementos. A un arreglo tipo matricial se lo denomina arreglo bidimensional o de dos
dimensiones, y usa dos índices para determinar sus elementos.
Las operaciones que se pueden realizar con arreglos durante el proceso de resolución de
un problema son:
Asignación;
Lectura / Escritura;
Ordenamiento;
Búsqueda.
Declaración de vectores
Los vectores se definen en la zona de declaración del programa. Dicha definición se
encabeza con la palabra reservada “Tipos estructurados”. Para declararlos se explicita el
nombre del mismo, acompañado de su dimensión, y a continuación se especifica el tipo de
sus elementos. Todos los elementos de un vector serán del mismo tipo.
APLICACIÓN DE ARREGLO UNIDIMENSIONAL:
Dados cuatro arreglos A, B, C y D de 20 elementos enteros cada uno, generar un arreglo
D de cuatro elementos, donde el contenido de cada elemento sea la suma de los 20
elementos de cada arreglo A , B, C y D es decir : D[1] = A[1]+ A[2]+ A[3]+…A[20].
Pseudocódigo:
Declaración de matrices
Las matrices se definen en la zona de declaraciones del programa, dentro del bloque de
Tipos estructurados. Para ello se especifica el nombre de la misma seguido de la cantidad
total de filas y de columnas, separadas por coma y encerradas entre corchetes, y luego se
escribe el tipo y precisión de los elementos.
En pseudocódigo:
Programa…..
Tipos estructurados
<nom_matriz>= Arreglo [filas,columnas] : <tipo> //declaro una matriz…//
Variables
<nom_variable>: <nom_matriz> //y luego una variable de tipo//
//matriz, donde alojarla//
Hacer
…
Fin Hacer
Fin Programa…..
La declaración reserva lugar en la memoria, lo asocia con el nombre de la matriz, pero su
contenido queda indeterminado, como ocurre con las variables. Es necesario hacer una
operación de asignación de valores, para que la matriz tenga elementos.
Entero A[20,7]
Prom = 0
Repetir desde (i=1, i<=20; i=i+1)
Escribe (“Captura la matricula”, i)
Leer (A[i,1])
Repetir desde (j=2, i<=6; j=j+1)
Leer (A[i,j])
Fin Repetir
Fin Repetir
Repetir desde (i=1, i<=20; i=i+1)
Repetir desde (j=2, i<=6; j=j+1)
Prom=prom+(A[i,j])
Fin Repetir
A[i,7]=prom/5
Fin Repetir
Fin
PILAS:
Una Pila es una colección ordenada de elementos en la que se pueden insertar y suprimir
por un extremo, llamado tope. Se conoce como una estructura de datos LIFO (last-in,
firstout), último en entrar, primero en salir.
Crear pila
Insertar elementos a la pila push(pila,elemento);
Eliminar elementos de la pila elemento=pop(pila);
Determinar si la pila esta vacía bandera=vacia(pila);
Determinar si la pila está llena bandera=llena(pila);
En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último
objeto apilado (denominado TOS, Top of Stack en inglés). La operación retirar permite la
obtención de este elemento, que es retirado de la pila permitiendo el acceso al siguiente
(apilado con anterioridad), que pasa a ser el nuevo TOS.
Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato
sobre una pila de platos, y una operación retirar a retirarlo.
Al utilizar arreglos para implementar pilas se tiene la limitación de que se debe reservar el
espacio en memoria con anticipación. Una vez dado un máximo de capacidad a la pila no
es posible insertar un número de elementos mayor que el máximo establecido. Si esto
ocurre, en otras palabras si la pila está llena y se intenta insertar un nuevo elemento, se
producirá un error conocido como desbordamiento (overflow).
Otro error que se puede presentar es tratar de eliminar un elemento de un pila vacía. Este
tipo de error se le conoce como subdesbordamiento (underflow).
APLICACIONES DE PILAS
1. AB = Infija
2. AB = posfija
3. AB = Prefija
AB = Infija: Esta notación es Infija porque el operador se encuentra entre los operadores.
AB = posfija: Esta notación es Posfija porque el operador se encuentra después de los
operadores.
AB = Prefija: Esta es una notación Prefija porque el operador se encuentra antes de los
operadores.
Realizar un algoritmo en el cual se realice una operación aritmética utilizando notación posfija.
COLAS
Una cola es una colección ordenada de elementos donde la adición de nuevos elementos
tiene lugar en uno de los extremos, denominado “final”, y la remoción de elementos
existentes ocurre en el otro extremo, comúnmente llamado “frente”. Un elemento ingresa a
la cola por el final y espera hasta el momento que un elemento sea eliminado para avanzar
hacia el frente.
El ejemplo más simple de una cola es la fila típica en la que todos participamos de vez en
cuando. Esperamos en una fila para una película, esperamos en la fila de pago en una
tienda de comestibles, y esperamos en la fila de la cafetería (para que podamos extraer de
la pila de bandejas). Las colas son muy restrictivas en el sentido de que sólo tienen un
modo de ingresar a ella y una sola salida. No hay saltos en el medio y no es posible salir
antes de que se haya esperado la cantidad necesaria de tiempo para llegar al frente.
Cola() crea una nueva cola que está vacía. No requiere parámetros y devuelve una cola
vacía.
agregar(item) agrega un nuevo ítem al final de la cola. Requiere el ítem y no devuelve valor.
avanzar() elimina el ítem del frente de la cola. No requiere parámetros y devuelve el ítem
que se eliminó. La cola es modificada.
estaVacia() verifica si la cola está vacía. No requiere parámetros y devuelve un valor
booleano.
tamano() devuelve el número de ítems en la cola. No requiere parámetros y devuelve un
entero.
c.estaVacia() [] True
c.agregar(8) [8]
c.agregar(nuevo) [nuevo,8]
c.agregar(oso) [oso,nuevo,8]
c.agregar(auto) [auto,oso,nuevo,8]
c.tamano() [auto,oso,nuevo,8] 4
Colas circulares (anillos): en las que el último elemento y el primero están unidos.
Colas de prioridad: En ellas, los elementos se atienden en el orden indicado por una
prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se
atenderán de modo convencional según la posición que ocupen. Hay dos formas de
implementación:
1. Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener
la cola ordenada por orden de prioridad.
2. Crear tantas colas como prioridades haya, y almacenar cada elemento en su
cola.
Bicolas (o Colas doblemente terminadas): son colas en donde los nodos se pueden
añadir y quitar por ambos extremos; se les llama DEQUE (Double Ended QUEue). Para
representar las bicolas lo podemos hacer con un arreglo circular con Inicio y Fin que
apunten a cada uno de los extremos. Hay variantes:
Bicolas de entrada restringida: Son aquellas donde la inserción sólo se hace por el final,
aunque podemos eliminar al inicio ó al final.
Bicolas de salida restringida: Son aquellas donde sólo se elimina por el final, aunque se
puede insertar al inicio y al final.
LISTAS
Es una estructura dinámica, donde el número de nodos en una lista puede variar a medida
que los elementos son insertados y removidos, el orden entre estos se establece por
medio de un tipo de datos denominado punteros, apuntadores, direcciones o referencias
a otros nodos, es por esto que la naturaleza dinámica de una lista contrasta con un arreglo
que permanece en forma constante.
LISTAS ENLAZADAS SIMPLES
Cada elemento de la lista, a excepción del primero, tiene un único predecesor y cada
elemento de la lista, a excepción del último, tiene un único sucesor.
Los nodos, en forma general, constan de dos partes: el campo información y el campo
liga. El primero contendrá los datos a almacenar en la lista; el segundo será un puntero
empleado para enlazar hacia el otro nodo de una lista.
Las operaciones más importantes que se realizan en las estructuras de datos Lista son
las siguientes:
Búsqueda
Inserción
Eliminación
Recorrido
Un nodo de una lista enlazada simple puede determinar quien se encuentra después de
él pero no puede determinar quien se encuentra antes, ya que solo cuenta con la dirección
del nodo siguiente pero no del anterior.
Son listas que tienen un enlace con el elemento siguiente y con el anterior. Una ventaja
que tienen es que pueden recorrerse en ambos sentidos, ya sea para efectuar una
operación con cada elemento o para insertar/actualizar y borrar. Otra ventaja es que las
búsquedas son algo más rápidas puesto que no hace falta hacer referencia al elemento
anterior. Su inconveniente es que ocupan más memoria por nodo que una lista simple.
Al final de la lista
Al inicio de la lista
De cierta posición
Inserción
Al final de la lista
Al inicio de la lista
Debe de definir un nodo que sea la referencia del primer nodo. Nodo
temp=ini
Debe definir una variable entera que cuente las posiciones dentro de
la lista.
Iniciar el recorrido mediante un ciclo mientras que temp!=null y
además cont sea diferente de la posición donde se quiere insertar el
nuevo elemento.
Recorridos
Se crea una referencia de Nodo para empezar el recorrido a partir del inicio. Nodo
temp=ini
Se realiza el recorrido a través de un ciclo mientras que temp!=null
Se crea una referencia de Nodo para empezar el recorrido a partir del inicio.
Nodo temp=fin
Se realiza el recorrido a través de un ciclo mientras que temp!=null
Eliminar
ini=fin=-1
Ini=fin=-1
Fin.ant=null
Poner al nodo anterior como final
Fin=ant
Ini=fin=-1
REFERENCIAS BIBLIOGRÁFICAS
Cairo, Osvaldo; Guardati, Silvia. Estructura de Datos, Tercera Edición. Mc Graw Hill, México, 2006.
Joyanes Aguilar, Luis. Fundamentos de Programación. Algoritmos y Estructuras de Datos. Tercera Edición
2003. McGraw – Hill.
Guardati, Silvia. Estructura de Datos Orientada a Objetos Algoritmos con C++, Primera Edición. Prentice
Hall, México, 2007.
C. Thomas Wu. Introducción a la Programación Orientada a Objetos con Java. Ed. Pearson Educación.
Roman Martinez, Elda Quriga. Estructura de Datos Referencia practica con orientación a objetos. Ed.
Thomson, Mexico, 2004.