Estructuras de Datos
Almacenamiento Contiguo Lineales Estructuras de Datos No lineales Almacenamiento No Contiguo
PILAS
Definicin: Estructura de datos lineal donde los elementos pueden ser aadidos o removidos solo por un extremo. Trabajan con filosofa LIFO (Last In- First Out ). Ejemplos:
Pila de platos Pila de discos Pila de llamadas a funciones Pila de recursion Pila de resultados parciales de formulas aritmticas, etc.
REPRESENTACIN DE PILAS:
Usando arreglos: Define un arreglo de una dimensin (vector) donde se almacenan los elementos.
TOPE: Apunta hacia el elemento que se encuentra en el extremo de la pila. (inicialmente es -1).
Ejemplo
Insertar Inicio: A: Insertar B: Insertar C: Eliminar elemento
C B A
Tope -1 Tope
B A
Tope
B A
Tope
A
Tope
Interface para una pila de datos enteros: interface IPila { public boolean llena(); public boolean vacia(); public void push (int elem); public int pop(); }
public class Stack { private Vector items; public Stack() { items = new Vector(10); } public Object push(Object item){ items.addElement(item); return item; } public synchronized Object pop(){ int len = items.size(); Object obj = null; if (len == 0) throw new EmptryStackException(); obj = items.elementAt(len-1); items.removeElementAt(len 1); return obj; } public boolean isEmpty() { if (items.size == 0) return true; else return false; } }
Aplicaciones de Pilas
EXPRESIONES ARITMETICAS:
Una expresin aritmtica contiene constantes, variables y operaciones con distintos niveles de precedencia.
OPERACIONES :
^ potencia */ multiplicacin, divisin +,- suma, resta
NOTACIONES:
NOTACION INFIJA: Los operadores aparecen en medio de los operandos. A + B, A 1, E/F, A * C , A ^ B , A + B + C, A+B-C NOTACION PREFIJA: El operador aparece antes de los operandos. + AB, - A1, /EF, *AC, ^AB, +AB+C, +AB-C
NOTACION POSTFIJA: El operador aparece al final de los operandos. AB+, A1-, EF/, AC*, AB^, AB+C+, AB+C-
Ejemplos
Convertir las siguientes expresiones infijas a posfijo A +B*C-D A * ((B-C) / 2)) ((X-Z)*(Y+W))/X+Y
REGLAS PARA EVALUAR UNA EXPRESION POSTFIJA Recorrer la expresion de izquierda a derecha 1. Si es un operando
1. almacenar el valor en la pila de valores
2. Si es un operador:
1. Obtener dos operandos de la pila de valores 2. Aplicar el operador 3. Almacenar el resultado en la pila de valores
Al finalizar el recorrido, el resultado estar en la pila de valores
Aplicaciones de Pilas
Funciones Recursivas
Las pilas pueden ser usadas para implementar la recursin en programas. Una funcin o procedimiento recursivo es aquel que se llama a si mismo. Ejemplos:
Factorial Nmeros de Fibonacci Torres de Hanoi Algoritmos de Ordenamiento de datos Etc.
Aplicaciones de Pilas
Recursion
// Funcion factorial public static int factorial(int n) { if (n<=1) return 1; else return n*factorial(n-1); }
// Funcion fibonacci public static int fib(int n) { if (n==1) return 0; else if (n==2) return 1; else return fib(n-1)+fib(n-2); }
Aplicaciones de Pilas
Control de secuencia de programas.
Las pilas son requeridas para implementar el control de flujo de ejecucin de un programa con subprogramas (funciones, procedimientos o mtodos).
Subprogramas recursivos o no recursivos Existen llamadas a ejecucin de subprogramas. Un subprograma se ejecuta completamente antes de retornar al punto donde fue llamado.
Aplicaciones de Pilas
Control de secuencia de programas.
// Programa Principal class Principal{ public static void proceso1(){ System.out.println( proceso1 ); proceso2(); } public static void proceso2(){ System.out.println( proceso2 ); } public static void main(String[] args){ proceso1(); proceso2(); } }
Method Summary bool empty() ean Tests if this stack is empty. E peek() Looks at the object at the top of this stack without removing it from the stack. E pop() Removes the object at the top of this stack and returns that object as the value of this function. E push(E item) Pushes an item onto the top of this stack. int search(Object o) Returns the 1-based position where an object is on this stack.
COLAS
Definicion. Es una lista lineal de elementos en la que las operaciones de insertar y eliminar se realizan en diferentes extremos de la cola. Trabajan con filosofa FIFO ( First In - First out), el primer elemento en entrar es el primer elemento en salir. Ejemplos:
Cola de automviles esperando servicio en una gasolinera Cola de clientes en una ventanilla del banco para pagar un servicio Cola de programas en espera de ser ejecutados por una computadora.
TIPOS DE COLAS:
Cola simple: Estructura lineal donde los elementos salen en el mismo orden en que llegan. Cola circular: Representacin lgica de una cola simple en un arreglo. Cola de Prioridades: Estructura lineal en la cual los elementos se insertan en cualquier posicin de la cola y se remueven solamente por el frente. Cola Doble (Bicola): Estructura lineal en la que los elementos se pueden aadir o quitar por cualquier extremo de la cola (cola bidireccional).
Operaciones:
1.- Insertar A 2.- Insertar B 2.3.- Insertar C 4.- Remover Elemento 5.- Insertar D 6.- Remover Elemento
Implementacin de Colas
Arreglo
con frente fijo. con frente movible. circular.
Listas ligadas
Frente
Final
Cuando la cola esta vaca las variables frente y final son nulos y no es posible remover elementos. Cuando la cola esta llena ( frente = 0 y final = n-1) no es posible insertar elementos nuevos a la cola. Cuando se remueven elementos el frente puede incrementarse para apuntar al siguiente elemento de la cola (implementacion con frente movil) o los elementos en la cola pueden desplazarse una posicion adelante (implementacin con frente fijo) Recuperacin de espacio: Cuando no hay espacios libres al final del arreglo los elementos pueden ser desplazados para desocupar posiciones en un extremo del arreglo o se puede manejar una estructura circular.
Ejemplo: Suponer que usamos un arreglo de 5 posiciones. Usando la representacin de frente fijo y frente movible.
Frente A B C Final Al remover un elemento: Frente Final Frente B Final C
B C Frente fijo
Frente movible
Frente
Final
Frente B
Final C
B C
Insertar elemento D:
Frente Final Frente B Final C D
B C D
Frente
Final C D E
B C D E
Insertar elemento G:
Frente
Final
Cola Circular
Es una representacin lgica de la cola en un arreglo. El frente y final son movibles. Cuando el frente o final llegan al extremo se regresan a la primera posicin del arreglo.
Cola inicial
B C D Frente Final
Representacin de colas:
Usando memoria esttica: arreglos con tamao fijo y frente fijo o movible o represntacin circular.
Final Frente B C D
0 1 2
E
3
F
4
Frente
Interfase de un TDA llamado ICola: interface ICola{ public boolean llena(); public boolean vacia(); public void insertar (Object elem); public Object eliminar(); }
Ejercicio.
Definir una clase Cola con las operaciones bsicas en 3 implementaciones diferentes:
Con tamao fijo y frente fijo. Desplazamiento de
elementos cada vez que se remueve un elemento.
Desplazamiento de elementos cuando el final llegue al lmite del arreglo y existan elementos vacos al frente. Incrementar el tamao del arreglo cuando la cola este llena.
Colas en Java
Java contiene la definicin de interfaces y clases para el manejo de colas. Las colas son una coleccin de elementos diseadas para almacenar elementos que esperan ser procesados. Java contiene una interfase parametrizada Queue<E> y varias clases que que la implementan, entre ellas PriorityQueue<E>
Colas en Java
public interface Queue<E> extends Collection<E> { E element(); boolean offer(E o); E peek(); E poll(); E remove(); }
Method Summary
E element() Retrieves, but does not remove, the head of this queue, it throws an exception if this queue is empty.. bool offer(E o) ean Inserts the specified element into this queue, if possible. E peek() Retrieves, but does not remove, the head of this queue, returning null if this queue is empty.
E poll() Retrieves and removes the head of this queue, or null if this queue is empty. E remove() Retrieves and removes the head of this queue.
Type Parameters:
E - the type of elements held in this collection
Constructor Summary
PriorityQueue()
Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering (using Comparable).
PriorityQueue(Collection<? extends E> c)
Creates a PriorityQueue with the specified initial capacity that orders its elements according to their natural ordering (using Comparable).
PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
Creates aPriorityQueue with the specified initial capacity that orders its elements according to the specified comparator.
PriorityQueue(PriorityQueue<? extends E> c)
Method Summary
boolean void Comparator <? super E> add(E o) Adds the specified element to this queue. clear() Removes all elements from the priority queue. comparator() Returns the comparator used to order this collection, or null if this collection is sorted according to its elements natural ordering (using Comparable). iterator() Returns an iterator over the elements in this queue. offer(E o) Inserts the specified element into this priority queue. peek() Retrieves, but does not remove, the head of this queue, returning null if this queue is empty. poll() Retrieves and removes the head of this queue, or null if this queue is empty. boolean int remove(Object o) Removes a single instance of the specified element from this queue, if it is present. size() Returns the number of elements in this collection.
Iterator<E> boolean E
Tablas Hash
java.util Class Hashtable<K,V> java.lang.Object java.util.Dictionary<K,V> java.util.Hashtable<K,V> All Implemented Interfaces:
Serializable, Cloneable, Map<K,V>
Este ejemplo crea un tabla hash con llave de tipo String y datos de tipo Integer.
import java.util.Hashtable; public class Tabla{ public static void main (String[] arg){ Hashtable<String, Integer> numeros = new Hashtable<String, Integer>(); numeros.put("uno",1); numeros.put("dos", new Integer(2)); Integer n = numeros.get("dos"); if (n != null) System.out.println(n); } }
Hashtable(int initialCapacity) Constructs a new, empty hashtable with the specified initial capacity and default load factor, which is 0.75.
Hashtable(int initialCapacity, float loadFactor) Constructs a new, empty hashtable with the specified initial capacity and the specified load factor. Hashtable(Map<? extends K,? extends V> t) Constructs a new hashtable with the same mappings as the given Map.
LISTAS ENLAZADAS
1. Simples (con enlace simple) 2. Dobles (doblemente enlazadas) Existe diversas implementaciones de estas estructuras. Las variaciones mas comunes implementan listas circulares y listas con cabecera en sus dos variaciones (simples y dobles)
En lenguajes donde no se cuenta con memoria dinmica, las listas se implementan usando arreglos.
informacin
0 1
enlace
-1 4 7
inicio
2 3 4 5 6 7
El arreglo contiene dos campos: uno para la informacin y otro para relacionar al siguiente elemento. La lista se recorre desde el inicio y hasta encontrar un elemento que contenga un enlace vaco.
Leche
LISTAS
Una lista es una coleccin lineal de elementos llamados nodos donde el orden de los mismos se establece mediante punteros o referencias y existe un puntero/referencia especial llamado inicio para localizar al primer elemento. Ejemplos: inicio
*Lista enlazada de 0 elementos
Informacin enlace
Nodo
Almacenamiento de datos:
1. Arreglos: La relacin lineal esta implcita en la relacin fsica de los elementos. Desventaja: Almacenamiento esttico y tamao fijo. 2. Elementos enlazados: Agrega a cada elemento un campo de enlace, no requieren almacenamiento contiguo en memoria, se pueden aadir y borrar elementos fcilmente.
Listas Simples
Coleccin lineal de elementos llamados nodos. Existe un elemento llamado inicio que apunta al primer elemento de la lista. Cada nodo contiene un campo de enlace que apunta al siguiente elemento. El ltimo elemento de la lista en su campo enlace apunta a nulo. Al principio el apuntador inicio apunta a nulo.
Con las operaciones anteriores, define una interfase para una lista simple que contiene datos de tipo String.
Puntos Extras!!
Escribe un mtodo llamado copia que obtenga una copia de la lista y la regrese como resultado.
Ejercicio Implementar una cola usando una lista ligada. La cola contiene alumnos. Que elementos (datos) se requieren? Que mtodos se implementan?
frente
Alumno 1 Alumno 2 Alumno 3 Alumno 4
fin
Ejercicio Implementar una pila usando una lista ligada. La pila contiene nmeros enteros. Que elementos (datos) se requieren? Que mtodos se implementan?
tope 10 7 4 2
Tipos parametrizados
Define una clase para implementar una Pila/Cola usando una lista. Los datos que se almacenaran sern tipo Object. Que requiere un programa que use estas estructuras? Define una clase parametrizada para implementar una Pila usando una lista. Define una clase parametrizada para implementar una Cola usando una lista.
LISTAS DOBLES
Una lista doble es una estructura lineal de elementos llamados nodos los cuales contienen dos campos de enlace: uno al elemento anterior y otro al elemento siguiente de la lista. El primer nodo de la lista contiene nulo en su enlace al elemento anterior y el ltimo nodo de la lista contiene nulo en su enlace al public class Nodo{ elemento siguiente.
// atributos Object informacion; Nodo anterior; Nodo siguiente; // el constructor de nodos Nodo (Object n){ informacion = n; anterior = null; siguiente = null; }
Ejemplos:
A
fin
Con las operaciones anteriores, define una interfase para una lista doble que contiene datos de tipo Integer.
public interface IListaDoble{ public void insertar(Integer elemento); public boolean eliminar(Integer elemento); public Integer eliminar(); public boolean buscar(Integer elemento); public String recorrer(); public boolean vaca(); public int tamao(); }
La utilizacin de un nodo cabecera en listas enlazadas permiten que la implementacin de los mtodos de insercin y eliminacin sea mas sencilla, ya que evitan tratar de forma explcita los casos especiales (insertar al inicio o eliminar el primer elemento). Sin embargo, requieren de un nodo extra en la lista (el nodo cabecera).
Representacin:
1.- Lista simple c/cabecera y tierra:
Inicio Nodo cabecera