Estructuras de datos en memoria principal

Documentos relacionados
Unidad Nº V Listas Enlazadas

Pilas y Colas. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Estructura de Datos. Unidad de Aprendizaje: Unidad de Competencia II: Estructuras de Datos Lineales. M. en C. Edith Cristina Herrera Luna

Pilas, Colas. Andrea Rueda. Estructuras de Datos. Pontificia Universidad Javeriana Departamento de Ingeniería de Sistemas

Estructuras de Datos. La pila es un objeto dinámico en constante cambio.

Clases e instancias. Algoritmos y Estructuras de Datos I. Clases e instancias. memoria dinámica.

TAD: Pila. TALLER: TAD Pila

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Este material es de uso exclusivo para estudio, los textos fueron tomados textualmente de varios libros por lo que está prohibida su impresión y

Tema 6. Gestión dinámica de memoria

LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

Strings en Java. String es una clase, no un tipo primitivo. Las variables de tipo String, en cualquier instante, pueden contener:

Tema 5. Estructura de datos Pila

Este resumen ha sido elaborado para ser leído después de haber asistido a clase: pretende fijar y profundizar en los conceptos ya explicados.

INGENIERIA DE SISTEMAS 1 ESTRUCTURAS DE DATOS (Listas simples) INTRODUCCIÓN A LAS ESTRUCTURAS DE DATOS

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Capítulo. Listas, pilas y colas en C. Contenido. Introducción

TIPO DE DATO ABSTRACTO (TDA)

PROGRAMACION ORIENTADA A OBJETOS Ingenieria Informática Final Febrero 2006/07

Estructuras de Datos Abstractas en Lenguaje Java

Estructuras de datos: Pilas, Colas, Listas

Tema 7.- Fundamentos de la Programación Orientada a Objetos

INSTITUTO TECNOLÓGICO DE NUEVO LAREDO ING. EN SISTEMAS COMPUTACIONALES

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

DEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006

324 MR Versión 1 Prueba Integral 1/3 Semana 10 Lapso

Estructuras de Datos en Java

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

Temario 3/29/2016. Estructuras de Datos. Clase 4 Pilas y colas

Tema: Tipos Abstractos de Datos (TAD s) en C++.

Listas, Pilas, Colas y Punteros. Semana 3

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Definición de Memoria

Tabla de Símbolos. Programación II Margarita Álvarez

Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez

CAPÍTULO 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Árboles binarios de búsqueda

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

ASIGNATURA: ESTRUCTURA DE DATOS II

Listas enlazadas. Colección de clases de Java

El programa que permite el manejo de la base de datos tiene la siguiente funcionalidad:

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Clases Abstractas e Interfaces

Metodología y Tecnología de la Programación

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

Procesadores de lenguaje Tema 6 La tabla de símbolos

TEMA 8: Gestión dinámica de memoria

Java Básico. Métodos estáticos

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

ESTRUCTURAS DINÁMICAS DE DATOS (LISTAS)

Java para programadores

Tema 4.- Pilas y Colas

Iteradores y contenedores en C++

UNIDAD 9. DATOS COMPLEJOS PILAS

Estructuras de Datos Dinámicas. Diseñar y programar en lenguaje C soluciones utilizando estructuras de datos dinámicas

Patrones de Diseño. Patrón estructural Composite. Técnicas de Programación - Curso 2007/08

Arreglos Unidimensionales En este tipo de arreglo se hace uso de un índice solamente para hacer referencia a una posición particular del arreglo.

Organización de Computadoras

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

11. Algunas clases estándar de Java (II)

Parte II: Estructuras de datos y algoritmos

Java: Clases Abstractas e Interfaces

Universidad de Chile

ESTRUCTURAS DE DATOS OTOÑO 2014 DR. MARIO ROSSAINZ LOPEZ

STL: Standard Template Library

STL: Standard Template Library

Java: un rápido repaso

Principios de Computadoras II

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

INSTITUTO POLITECNICO NACIONAL. ESCUELA SUPEIRIOR DE INGENIERIA MECANICA Y ELECTRICA. UNIDAD CULHUACAN. INTEGRANTES: FLORES ACOLTZI ONESIMO

INDICE DEL CURSO APRENDER PROGRAMACIÓN JAVA DESDE CERO. PROGRAMACIÓN ORIENTADA A OBJETOS (CU00601B)

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Paradigmas de Programación

StringBuffer, Math y Wrapper

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

Tema 13: Apuntadores en C

2.2 Nombres, Ligado y Ámbito

UNIVERSIDAD DE SAN CARLOS DE GUATEMALA FACULTAD DE INGENIERIA ESCUELA DE CIENCIAS Y SISTEMAS

Contenedores asociativos en la STL de C++

FUNDAMENTOS DE INFORMÁTICA

Estructuras de Datos. Clase 5 Aplicaciones de Pilas y Colas

Tema 5.- Recursividad

El patrón Composite (Compuesto) Propósito Componer los objetos a una estructura de jerarquía de relación partetodo.

PILAS Fundamentos

EXAMEN PROGRAMACIÓN 21 de Septiembre de 2007 INGENIERÍA INFORMÁTICA Primera parte: Cuestiones 1,5 horas

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Programación Avanzada SOLUCIÓN EXAMEN FEBRERO 2011

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Conversión entre Tipos

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Programación de Objetos.Net C# LDP / DUOC-AV. Manejo de Colecciones y Listas... 1 Colecciones ArrayList y List... 1

Transcripción:

Estructuras de datos en memoria principal Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile fguidi@ucv.cl

Estructuras de datos v Estructuras básicas Arreglo Lista enlazada Simplemente enlazada Doblemente enlazada v Colecciones implementadas sobre las estructuras básicas: Lista, Lista con iterador Lista circular Pila Cola Hashtable Vector (Java) (Otras) 2

Arreglo v Es una colección ordenada de elementos del mismo tipo. v Es de largo fijo, definido al momento de instanciarlo. v El acceso a los elementos se hace a través de un subíndice. v Fácil de recorrer en ambos sentidos. v Estudiado en cursos anteriores 3

Listas enlazadas v Son estructuras dinámicas: se asigna memoria para los elementos de la lista en la medida que es necesario. v Cada elemento se almacena en una variable dinámica denominada nodo. v En la lista simplemente enlazada, cada nodo apunta al nodo que contiene el elemento siguiente 4

Esquema tentativo de una lista simplemente enlazada Nodos head ListaEnlazada data data data data null 5

Datos contenidos en la lista v Los nodos de una lista contendrán datos del tipo declarado en la estructura del nodo. Por ejemplo: Tipos primitivos (byte, int, boolean, char, etc.) Referencias a objetos v En los siguientes ejemplos consideraremos el uso de listas de enteros, aunque las técnicas que serán descritas son aplicables a cualquier otro tipo de lista. 6

Diagrama de clases de una lista simplemente enlazada v Diagrama de clases (lista de enteros): Lista agregaralfinal(d:data) estácontenido(d:data):boolean eliminar(d:data):boolean imprimircontenido() v Diagrama de objetos: 1..1 head data:int next Nodo getdata():int setnext(n:nodo) getnext():nodo Nodo(d:Data,n:Nodo) :Lista head:nodo data = 1 :Nodo data = 20 :Nodo data = -1 7

Una lista simplemente enlazada (versión preliminar) v Declaración de la Lista: public class Lista{ Nodo head = null; public void agregaralfinal(int data){... public void imprimircontenido(){... public boolean estacontenido(int data){... public boolean eliminar(int data){... 8

Nodos en una lista simplemente enlazada public class Nodo{ private int data; private Nodo next; public Nodo(int d, Nodo n){ data = d; next = n; public int getdata(){ return data; public Nodo getnext(){ return next; public void setnext(nodo n){ next = n; 9

Inserción en la lista simplemente enlazada v Insertar elementos: Al final de la lista Ejemplo: [ 25, 1, 14, 4 ] head Manteniendo un orden head 25 1 14 4 Al inicio de la lista 1 4 14 25 null null head 4 14 1 25 null 10

Inserción de elementos al final de la lista v Caso 1: la lista está vacía (variable head contiene null) head null head 25 null public Lista{... public void agregaralfinal(int dato){... head = new Nodo( dato, null );...... 11

Inserción de elementos al final de la lista v Caso 2 (general): la lista tiene al menos un elemento head 25 1 aux null 1. ubicar último nodo de la lista (aquél cuya variable next contiene null) 2. Instanciar el nuevo nodo con el contenido indicado 3. Asignar el nuevo nodo a la variable next del último nodo (asegurándose de que la variable next del nuevo nodo sea igual a null) head 25 1 14 null aux aux.setnext(new Nodo(dato, null)); 12

Inserción de elementos al final de la lista v Caso general: public class Lista{... public void agregaralfinal(int dato){ Nodo nuevo = new Nodo(dato, null); if( head == null ) head = nuevo; else{ Nodo aux = head; while( aux.getnext()!= null) aux = aux.getnext(); aux.setnext( nuevo );... 13

Recorrido de la lista v Método que imprime el contenido de la lista: public class Lista{... public void imprimircontenido(){ Nodo aux = head; while( aux!= null ){ System.out.print( aux.getdata() + "; " ); aux = aux.getnext(); System.out.println();... 14

Búsqueda en la lista v Retorna true si el elemento está contenido en la lista public class Lista{... public boolean estacontenido(int data){ Nodo aux = head; while( aux!= null ){ if( data == aux.getdata() ) return true; aux = aux.getnext(); return false;... 15

Eliminación de un elemento v Requiere identificar el nodo a borrar. v Caso 1: es el primer nodo de la lista head 25 1 14 4 head = head.getnext(); null head 25 1 14 4 Sin otras referencias: candidato a eliminación (recolector de basura de Java) null head 1 14 4 null 16

Eliminación de un elemento v Caso 2 (general): no es el primer nodo de la lista head 25 1 14 4 null aux aux.setnext(aux.getnext().getnext()); head 25 1 14 4 Sin otras referencias: candidato a eliminación (recolector de basura de Java) null head 25 1 4 null 17

Eliminación de un elemento public class Lista{... public boolean eliminar(int data){ if( head!= null) if( head.getdata() == data ){ head = head.getnext(); return true; else{ Nodo aux = head; while( aux.getnext()!= null ){ if( aux.getnext().getdata() == data ){ aux.setnext( aux.getnext().getnext() ); return true; aux = aux.getnext(); return false;... 18

Simplificación del esquema propuesto: uso de un nodo fantasma v En el esquema propuesto se deben hacer excepciones al insertar y eliminar el nodo del comienzo de la lista. v El manejo se simplifica si se utiliza un nodo fantasma : Es un nodo siempre presente en la lista Su contenido es irrelevante (el valor u objeto contenido no forma parte de la lista). 19

Lista simplemente enlazada con nodo fantasma v Lista vacía: head null v Lista con elementos: public class Lista{ Nodo head; public Lista(){ head = new Nodo(0, null);... Valor irrelevante head 25 1 4 Primer elemento de la lista null 20

Operación de inserción en la lista con nodo fantasma v La inserción del primer elemento de la lista entra en el caso general: head 1 null aux aux.setnext(new Nodo(dato, null)); Clase Lista public void agregaralfinal(int dato){ Nodo aux = head; while( aux.getnext()!= null) aux = aux.getnext(); aux.setnext( new Nodo(dato, null) ); 21

Eliminación del primer elemento en la lista con nodo fantasma v La eliminación del primer elemento de la lista entra en el caso general: aux aux.setnext(aux.getnext().getnext()); head 14 1 4 Sin otras referencias: candidato a eliminación (recolector de basura de Java) null 22

Eliminación del primer elemento en la lista con nodo fantasma (cont.) public boolean eliminar(int data){ Nodo aux = head; while( aux.getnext()!= null ){ if( aux.getnext().getdata() == data ){ aux.setnext( aux.getnext().getnext() ); return true; aux = aux.getnext(); return false; 23

Mejora al procedimiento de inserción de elementos al final de la lista v El procedimiento descrito anteriormente requiere que todas las veces sea encontrado el último elemento de la lista. v Más conveniente: tener una variable de instancia que siempre referencie al último elemento de la lista. v Esto aplica a listas con o sin nodo fantasma (con pequeños cambios). 24

Mejora al procedimiento de inserción de elementos al final de la lista (cont.) v Diagrama de clases: Lista agregaralfinal(d:data) estácontenido(d:data) eliminar(d:data):boolean imprimircontenido() 1..1 1..1 head 1..1 tail data: int Nodo getdata():data setnext(n:nodo) getnext():nodo Nodo(d:Data,n:Nodo) v Diagrama de objetos: Lista head ghost:nodo 1stNode:Nodo data = 20 2ndNode:Nodo data = -1 tail 25

Mejora al procedimiento de inserción de elementos al final de la lista (cont.) v La variable de instancia tail mantiene siempre la referencia al último elemento: head tail null public class Lista{ Nodo head, tail; public Lista(){ head = new Nodo(0, null); tail = head;... head tail 25 1 4 null 26

Mejora al procedimiento de inserción de elementos al final de la lista (cont.) v El método agregaralfinal ya no requiere recorrer la lista para ubicar el último nodo: public void agregaralfinal(int dato){ Nodo aux = new Nodo(dato, null) ; tail.setnext( aux ); tail = aux; Versión con nodo fantasma v La varaible tail es actualizada después de la inserción. v Notar que el procedimiento de eliminación debe actualizar la referencia tail si se remueve el último nodo de la lista. 27

Inserción en orden/al inicio v Ejercicio 1: implemente el método: agregarenorden(int dato) que recibe un entero y lo agrega en orden ascendente a la lista. v Ejercicio 2: implemente el método agregaralinicio(int dato) que recibe un entero y lo agrega como primer elemento. 28

Resumen listas simplemente enlazadas v Útiles para guardar un número no predefinido de elementos. v Distintas disciplinas para mantener los datos ordenados (y para removerlos). v El acceso a los nodos es secuencial; el recorrido es en una sola dirección (Ejercicio: confrontar con arreglos) 29

Listas doblemente enlazadas v Están diseñadas para un acceso fácil al nodo siguiente y al anterior. v Cada nodo contiene dos referencias: una apuntando al nodo siguiente, y otra apuntando al nodo anterior. v El acceso a los nodos sigue siendo secuencial. v La técnica del nodo fantasma puede ser útil también en este tipo de lista. head null 1 14 4 null 30

Comentarios finales sobre estructuras elementales v Estar abierto a definir y utilizar otras estructuras. v Ejemplo: Lista simplemente enlazada y circular head 25 1 14 4 31

Colecciones implementadas sobre estructuras básicas Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile fguidi@ucv.cl

Interfaces versus implementación v En la sección anterior estudiamos estructuras elementales para implementar colecciones. v En esta sección estudiaremos colecciones clásicas, desde dos perspectivas: La interfaz de la colección (cómo se utiliza) La implementación de la colección (cómo se construye) v Una misma interfaz puede ser soportada por múltiples implementaciones v La eficiencia en la operación de una colección va a depender de su implementación 33

Listas v Representa una colección conformada por una secuencia finita y ordenada de datos denominados elementos. v Ordenada implica que cada elemento tiene una posición. v Los elementos corresponden a un tipo de dato. v La lista está vacía cuando no contiene elementos. v El número de elementos se denomina largo de la lista. v El comienzo de la lista es llamado cabeza (head), y el final cola (tail). v Notación: (a 1, a 2,..., a n ). 34

Lista: versión clásica v Además de los datos, el estado de la lista contiene una identificación (referencia) al dato actual. (12, 22, 50, 30). v La lista provee operaciones para: Cambiar (modificar la referencia) del dato actual Retornar el dato actual Eliminar el dato actual Modificar el dato actual Insertar un dato en la posición del dato actual Borrar toda la lista, buscar elementos en la lista, contar sus elementos 35

Interfaces para la versión clásica de la lista v No hay una única definición formal de interfaz. v Estudiaremos dos extremos: Interfaz elemental Interfaz extendida 36

Interfaz elemental para la lista clásica public interface List { public void clear(); // Elimina todos los elem. public void insert(object item); // Inserta elem. en act. public Object remove(); // Saca/retorna elem. public void setfirst(); // Setea act. en 1ra pos. public void next(); // Mueve act. a sig. pos. public int length(); // Retorna largo public void setvalue(object val);// Setea elemento public Object currvalue(); // Retorna elemento public boolean isempty(); // True: lista vacía public boolean eol(); // True: act en end of list public String tostring(); // Retorna lista de elem. Nota: pos.=posición; act.=posición actual; sig.:siguiente; prev.:previa 37

Ejemplo de uso de una lista (versión clásica) v Sea la siguiente lista: v Operaciones: milista.insert(99) : milista=(12, 22, 50, 30) Dato actual milista.next(): milista=(12, 99, 22, 50, 30) Dato actual milista=(12, 99, 22, 50, 30) Dato actual 38

Ejemplo de uso de una lista (versión clásica) milista.currvalue(): milista.remove(): milista=(12, 99, 22, 50, 30) Dato actual 22 milista=(12, 99, 50, 30) (Nuevo) dato actual 22 milista.setfirst(): milista=(12, 99, 50, 30) Dato actual 39

Interfaz extendida para la lista clásica public interface ExtendedList { public void clear(); // Elimina todos los elem. public void insert(object item); // Inserta elem. en act. public void append(object item); // Agrega elem. al final public Object remove(); // Saca/retorna elem. public void setfirst(); // Setea act. en 1ra pos. public void next(); // Mueve act. a sig. pos. public void prev(); // Mueve act. a pos. prev. public int length(); // Retorna largo public void setpos(int pos); // Setea act. a pos public void setvalue(object val);// Setea elemento public Object currvalue(); // Retorna elemento public boolean isempty(); // True: lista vacía public boolean eol(); // True: act en end of list public String tostring(); // Retorna lista de elem. Nota: pos.=posición; act.=posición actual; sig.:siguiente; prev.:previa 40

Implementación de la lista clásica v La conveniencia de una u otra implementación depende de las operaciones definidas en la interfaz. v Interfaz elemental: Implementación basada en lista simplemente enlazada Implementación basada en arreglos Implementación basada en lista doblemente enlazada (sobredimensionada) v Interfaz extendida: Implementación basada en arreglos Implementación basada en lista doblemente enlazada Implementación basada en lista simplemente enlazada 41

Implementación de la lista clásica basada en arreglos v Usa un arreglo para almacenar los elementos de la lista. v Los elementos son almacenados en posiciones contiguas en el arreglo. v El elemento i de la lista se almacena en la celda i-1 del arreglo. v La cabeza de la lista siempre está en la primera posición del arreglo (0). v El máximo número de elementos en la lista se define al crear el arreglo. 42

Inserción en lista basada en arreglos Insertar 23 13 12 20 8 3 0 1 2 3 4 5 (a) 13 12 20 8 3 0 1 2 3 4 5 (b) 23 13 12 20 8 3 0 1 2 3 4 5 (c) 43

Comparación entre implementaciones de listas v Las listas basadas en arreglos tienen la desventaja de que su número de elementos debe ser predeterminado. v Cuando estas listas tienen pocos elementos, se desperdicia espacio. v Las listas enlazadas no tienen límite de número máximo de elementos (mientras la memoria lo permita). 44

Comparación entre implementaciones de listas v Las listas basadas en arreglos son más rápidas que aquellas basadas en listas enlazadas para el acceso aleatorio por posición. v Las operaciones de inserción y eliminación son más rápidas en las listas enlazadas. v En general, si el número de elementos que contendrá una lista es muy variable o desconocido, es mejor usar listas enlazadas. 45

Uso de listas v Supongamos las siguientes implementaciones de la lista: LList, implementa List mediante una lista simplemente enlazada AList, implementa List mediante un arreglo v Referenciamos la lista por medio de su interfaz:... List lista = new LList(); // Implementación seleccionada lista.insert( Hola ); lista.insert( chao ); lista.setfirst(); while(!lista.eol() ){ System.out.println( (Sring)lista.currValue()); lista.next(); lista.setfirst(); String eliminado = (String) lista.remove()... 46

Uso de listas (cont.) v Si en el programa anterior ahora se desea utilizar otra implementación de lista, sólo debe cambiarse la clase a instanciar.... List lista = new AList(); // Implementación seleccionada lista.insert( Hola ); lista.insert( chao ); lista.setfirst(); while(!lista.eol() ){ System.out.println( (Sring)lista.currValue()); lista.next(); lista.setfirst(); String eliminado = (String) lista.remove()... 47

Pilas v Es un tipo restringido de lista, en donde los elementos sólo pueden ser insertados o removidos desde un extremo, llamado top. v Se le llama también Stack o Lista LIFO (Last In, First Out). v La operación para insertar un nuevo elemento se denomina push. v La operación para remover un elemento se denomina pop. 48

Interfaz para la Pila public interface Stack { public void clear(); // Remueve todos los objetos public void push(object it); // Agrega objeto al tope public Object pop(); // Saca objeto del tope public Object topvalue();// Retorna objeto en el tope public boolean isempty(); // True: pila vacía 49

Ejemplo de uso de una pila v pila.push(4): v pila.push(14): 4 top 14 4 top v pila.push(1): v pila.pop(): 1 14 4 top 14 4 1 top (nuevo) 50

Implementación de una pila mediante lista simplemente enlazada top null pila.push(4) top pila.push(14) 4 null Se inserta y remueve siempre el primer elemento: no se requiere nodo fantasma top pila.pop() 14 4 null top 4 null 51

Implementación de una pila mediante un arreglo top=4 3 5 8 2 0 1 2 3 4 5 v En esta clase, por conveniencia, se usa una variable top, que siempre está 1 posición más adelante del elemento superior de la pila. 52

Ejercicio pilas v Proponga implementaciones de la pila: Basada en un arreglo Basada en una lista simplemente enlazada 53

Colas v Es un tipo restringido de lista, en donde los elementos sólo pueden ser agregados al final, y removidos por el frente. v Se le llama también Queue o Lista FIFO (First In, First Out). v La operación para agregar un nuevo elemento se denomina enqueue. v La operación para remover un elemento se denomina dequeue. 54

Interfaz para la Cola public interface Queue { public void clear(); // Remueve todos los objetos public void enqueue(object it);// Agrega obj. al final public Object dequeue(); // Saca objeto del frente public Object firstvalue(); // Retorna obj. del frente public boolean isempty(); // Retorna V si cola vacía 55

Ejemplo de uso de una cola v cola.enqueue( 20 ) cola=(20) v cola.enqueue( 15 ) cola=(20, 15) v cola.enqueue( 40 ) cola=(20, 15, 40) v cola.dequeue() cola=(15, 40) v cola.dequeue() 20 cola=(40) 15 56

Cola basada en lista simplemente enlazada front 25 1 4 1 null rear v Es conveniente mantener una referencia al último elemento de la cola (facilita operación enqueue). 57

Cola basada en arreglos (cont.) v Aproximación simple: almacenar los n elementos de la cola en las n primeras posiciones del arreglo. rear=3 3 5 8 2 Sacar del frente: rear=2 5 8 2 Problema: lentitud de procedimiento dequeue (sacar primer elemento). 58

Cola basada en arreglos (cont.) v Aproximación mejorada: al hacer dequeue, no desplazar elementos, sino asumir que el frente de la cola se desplaza. front=0 rear=3 3 5 8 2 Sacar del frente: front=1 5 8 2 rear=3 Problema: Al sacar y agregar elementos, rear llega a la última posición del arreglo y la cola no puede crecer, aun cuando existan posiciones libres al comienzo. 59

Cola basada en arreglos* (cont.) v Arreglo circular: Pretender que el arreglo es circular, y permitir que la cola continúe directamente de la última posición del arreglo a la primera. 7 0 front=0 Función de avance 6 3 5 1 Dados: pos: posición actual size: tamaño arreglo 5 4 2 3 8 2 rear=3 pos=(pos+1); if (pos>=size) pos=0; 60

Cola basada en arreglos* (cont.) v Problema de arreglo circular: Si front es igual a rear, implica que hay 1 elemento. Luego, rear está una posición detrás de front implica que la cola está vacía. Pero si la cola está llena, rear también está una posición detrás de front. v Problema: Cómo reconocer cuando una cola está vacía o llena? v Solución: Usar un arreglo de n posiciones, para almacenar como máximo n-1 elementos. 61

Cola basada en arreglos* (cont.) v Por conveniencia, se usa una variable front para apuntar a la posición precedente al elemento frontal. v La cola está vacía cuando front=rear. v La cola está llena cuando rear está justo detrás de front, o sea cuando la función de avance indica que de aumentar rear en 1, se llegaría a front. 62