410 likes | 800 Views
Estructura de Datos En C++. Dr. Romeo S ánchez Nigenda . E-mail: romeo.sanchez @ gmail.com http: //yalma.fime.uanl.mx/~ romeo / Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes.
E N D
Estructura de Datos En C++ Dr. Romeo SánchezNigenda. E-mail: romeo.sanchez@gmail.com http://yalma.fime.uanl.mx/~romeo/ Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes. Website: http://yalma.fime.uanl.mx/~romeo/ED/2011/ Sesiones: 48
Objetivo General: Conocerá y manejará las estructuras internas de información Temario: • Conceptos Básicos • La Pila • Colas • Recursión • Listas • Árboles • Ordenamiento • Búsqueda • Administración de Almacenamiento Total a calificar: 110 puntos. 40% Tareas 30% Examen Parcial 30% Examen Final 10% Participación
Material de apoyo: Estructura de Datos con C y C++. YedidyahLangsam, Moshe J. Augenstein, Aaron M. Tenenbaum, Brooklyn College SegundaEdición, Prentice-Hall. Algorithms. ThirdEdition. Parts 1-4, Fundamentals Data StructuresSortingSearching Robert Sedgewick. Estructura de Datos. Román Martínez, Elda Quiroga. ThomsonLearning. Cualquier libro de Estructura de Datos! Software: Compiladores GCC (GNU CompilerCollection) IDEs (IntegratedDevelopmentEnvironment): http://www.eclipse.org/downloads/ http://kdevelop.org/ http://www.bloodshed.net/devcpp.html
3. La Cola (Queue) • Objetivo: El alumno conocerá la estructura denominada la Cola o Fila, representación y aplicaciones. • Temario: • Representación de Colas • Operaciones con Colas • Colas circulares • Doble cola • Aplicaciones de colas
La Cola (Queue) • Conjunto de elementos del que pueden suprimirse elementos de un extremo (la parte delantera de la cola, front), y pueden agregarse elementos en el otro extremo (la parte posterior de la cola (rear)). Agrega Elimina Front Rear • Primer elemento insertado es el primero en suprimirse (estructura FIFO, first in firstout). • De manera genérica la cola necesita: • Un TAD para almacenar sus elementos • Un índice para indicar la posición del frente de la cola • Un índice para indicar la parte posterior de la cola
Colas: Operaciones • Insertar (insert(q,i)): Agrega elemento i en la parte posterior de la cola q • Remover (remove(q)): Suprime el elemento delantero de la cola q, checando que la cola no se encuentre vacía • Empty : (empty(q)) Retorna falso o verdadero dependiendo si la cola q está vacía o no, el número de elementos está dado por q.rear-q.front+1 Usandoarreglos Insert(q,A) Insert(q,B) Insert(q,C) Existe un problema, cuál es? q.Elems rear=front rear rear front rear Init q.Front=0 q.Rear =-1 rear front front front Vacía = True Remove(q) Remove(q) If q.rear<q.front
Colas: Representación Básica #define SIZEQ 100 structColaBasica{ intfrente; intcola; intelementos[SIZEQ]; }; boolestaVacia(structColaBasica * C){ return (C->cola < C->frente); } frente cola inicio
Colas: Representación Básica boolmueveCola(structColaBasica * C){ if(C->frente>0){ int j = 0; for(inti=C->frente;i<=C->cola;i++){ C->elementos[j++] = C->elementos[i]; } C->frente = 0; C->cola=j-1; returntrue; } returnfalse; } Cola Frente Cola Frente
Colas: Representación Básica void insert(structColaBasica * C, intelem){ boolhayEspacio = true; if(C->cola+1 > SIZEQ-1){ hayEspacio = mueveCola(C); } if(hayEspacio){ C->elementos[++C->cola]=elem; }else{ cout<<"Elemento no se pudoinsertar!"<<endl; } } Cola Cola Frente Frente
Colas: Representación Básica int remove(structColaBasica * C){ if(!estaVacia(C)){ return (C->elementos[C->frente++]); }else{ cout<<"Error cola vacia!"<<endl; exit(1); } } Cola Cola Frente Frente
Colas Circulares usando Arreglos • Evitamos mover elementos is asumimosque la cola es circular, esdecir, que el primer elemento del arregloestá inmediatamente después del el último elemento. • Se puedereservar un elemento en el arregloparadeterminarsi la cola se encuentravacía o no. Frente N Se reserva un arreglo con un espacio más N=MAX +1 boolestaVacia(structColaCircularq){ returnq.frente % N == q.cola; } boolestaLlena(structColaCircularq){ returnq.cola + 1== q.frente; } MAX elementos [1] [0] Cola • Utilizamos el tamaño de la cola paradeterminarcuandorestablecernuestrosapuntadores al índice 0, yasísimularque la Cola es circular!
Colas Circulares usando Arreglos: Ejemplo Frente Frente Frente Frente Insert(q,A) Insert(q,B) Insert(q,C) Insert(q,D) Cola Cola Cola Cola Remove(q) Remove(q) Remove(q) Remove(q) Cola Cola Cola Cola Frente Frente Frente Frente
Colas Circulares usando Arreglos: Remoción intremueveCola(ColaCircular * q) { if(!estaVacia(q)) { q->frente =q->frente%N; returnq->elementos[q->frente++]; } else { cout << "Error, Cola vacía" << endl; return ERROR; } } 1 2,3 Frente Remove(q) Pasos básicos: 0) Verifica que no esté vacía 1) Determina la posición correcta de Frente 2) Guarda el elemento a retornar 3) Incrementa frente Cola Cola 3) Frente 1) Frente 2 Elementoremovido: A
Colas Circulares usando Arreglos: Inserción voidinsertaCola(ColaCircular* q, int x) { if(!estaLlena(q)) { q->elementos[q->cola++] = x; q->cola = q->cola% N; } else { Cout << "Error, Cola llena" << endl; return; } } 1, 2 3 2) Cola Insert(q,F) Cola 1) Cola Pasos básicos: 0) Verifica que no esté llena 1) Inserta en la posición de cola 2) Incrementa el valor de cola 3) Determina la posición correcta de cola Frente Frente b) Cola 3) Cola
Doble Cola: Bicola • Cola bidimensional en la quelasinserciones y eliminaciones se puedenrealizar en cualquiera de los dos extremos de la cola. • Cola doble con entradarestringida: Aceptainserciones solo al final de la cola • Cola doble con salidarestringida: Aceptaeliminaciones solo al inicio de la cola • A diferencia de una cola sencilla, debehaber dos métodos para leer y dos para escribir para considerar el frente y la parte posterior • Podemos utilizar un contador para el número de elementos
Doble Cola: Operaciones insertaAtras(q,A) insertaAtras(q,B) Cola Cola Cola Frente Frente Frente Inicio: insertaFrente(q,E) insertaFrente(q,C) insertaFrente(q,D) Numelems= MAX Cola Cola llena! Cola Frente Frente Frente
Doble Cola: Operaciones RemueveFrente(q) Numelems= MAX Cola Cola Copia Frente Frente Frente RemueveAtras(q) Cola Cola Frente Frente
Doble Cola: Operaciones structBicola { intnelems; intfrente; intcola; intelementos[MAXQUEUE]; }; int empty() { return items == 0; } Bicola q; q.nelems = 0; q.frente = 0; q.cola = 0;
Doble Cola: Operaciones insertaAtras(q,B) void insertaAtras(Bicola * q, int x){ if (q->nelems == MAXQUEUE){ cout<<"Error, cola llena"; exit(1); } q->elementos[q->cola] = x; q->nelems ++; q->cola ++; } Cola Cola Frente Frente Frente
Doble Cola: Operaciones insertaFrente(q,C) void insertaFrente(Bicola * q, int x){ if (q->nelems == MAXQUEUE){ cout<<"Error, cola llena"; exit(1); } mueveBicolaUp(q); q->elementos[q->frente] = x; q->nelems ++; q->cola ++; } Cola Cola Frente Frente
Doble Cola: Operaciones Numelems= MAX RemueveFrente(q) Cola Cola intremueveFrente(Bicola * q){ int d; if ( empty() ) returnt_error; q->nelems --; q-> cola --; d = q->elementos[q->frente]; mueveBicolaDown(q); return d; } Frente Frente Frente
Doble Cola: Operaciones RemueveAtras(q) intremueveAtras(Bicola * q){ if ( empty() ) returnt_error; q->nelems --; return q->elementos[-- q->cola]; } Cola Cola Frente Frente
Aplicaciones de Colas • En CienciasComputacionales, Investigación de Operaciones, y muchasotrasáreasdondedatos son almacenadospara ser procesadosposteriormente, ejecutandounafunción de buffer (e.g., inventarios, threads, simulación, manufactura, etc).