890 likes | 2.56k Views
Pilas y Colas. Cursos Propedéuticos 2006 Programación y Estructuras de Datos Manuel Montes (mmontesg@inaoep.mx) Claudia Feregrino (cferegrino@inaoep.mx). Contenido de la sección. Pilas Definición Implementación usando arreglos Ejemplos de aplicación Colas Definición
E N D
Pilas y Colas Cursos Propedéuticos 2006 Programación y Estructuras de Datos Manuel Montes (mmontesg@inaoep.mx) Claudia Feregrino (cferegrino@inaoep.mx)
Contenido de la sección • Pilas • Definición • Implementación usando arreglos • Ejemplos de aplicación • Colas • Definición • Implementación usando arreglos • Ejemplos de aplicación
La estructura de datos PILA • Su nombre se deriva de la metáfora de una pila de platos en una cocina. • La inserción y extracción de elementos de la pila siguen el principio LIFO (last-in-first-out). • El último elemento en entrar es el único accesible en cada momento. Sale Entra Tope
Operaciones de una PILA • Las operaciones básicas de una pila son “push” (empujar, meter) y “pop” (sacar) • Push: añade un nuevo elemento a la pila • Pop: elimina un elemento de la pila • Otras operaciones usualmente incluidas en el tipo de dato abstracto pila son: • isEmpty (estáVacia): verifica si la pila está vacía • isFull (estáLlena): verifica si la pila está llena
Ejemplo 1 4 1 1 1 1 1 4 4 4 4 4 4 push(4) pop() pop() push(1) push(1) push(4)
Implementación con arreglos • Una pila es una colección ordenada de objetos. • En C, los arreglos permiten almacenar colecciones ordenadas. • La desventaja de implementar una pila mediante un arreglo es que esta última es de tamaño fijo, mientras que la pila es de tamaño dinámico. #define STACKSIZE 100 struct Stack{ int top; int nodes[STACKSIZE]; }; struct Stack *create_stack (struct Stack *ps) { ps = (struct Stack *) malloc(sizeof(struct Stack)); ps->top=-1; return ps; } main(){ struct Stack *ps; ps=create_stack(ps); : }
Las operaciones básicas void push(struct Stack* ps, int i) { if (ps->top == (STACKSIZE -1)) printf(“Full stack\n"); else { ps->top++; ps->nodes[ps->top] = i; } } POP PUSH int pop(struct Stack *ps) { if (ps->top== -1) printf(“Empty stack\n"); else { int t= ps->nodes[ps-> top]; ps->top--; return t; } }
Aplicaciones de las pilas • Navegador Web • Se almacenan los sitios previamente visitados • Cuando el usuario quiere regresar (presiona el botón de retroceso), simplemente se extrae la última dirección (pop) de la pila de sitios visitados. • Editores de texto • Los cambios efectuados se almacenan en una pila • Usualmente implementada como arreglo • Usuario puede deshacer los cambios mediante la operación “undo”, la cual extraer el estado del texto antes del último cambio realizado.
La estructura de datos COLA • Su nombre se deriva de la metáfora de una cola de personas en una taquilla. • La inserción y extracción de elementos de la cola siguen el principio FIFO (first-in-first-out). • El elemento con más tiempo en la cola es el que puede ser extraído. Entra cola frente Sale
Operaciones de una COLA • Las operaciones básicas de una cola son “enqueue” (meter) y “dequeue” (sacar) • enqueue: añade un nuevo elemento a final de la cola • dequeue: elimina (saca) el primer elemento de la cola • Otras operaciones usualmente incluidas en el tipo abstracto COLA son: • isEmpty (estáVacia): verifica si la cola está vacía • isFull (estáLlena): verifica si la cola está llena
Ejemplo a a a b a b a c b a c b c b c b Apuntadores al frente y a la cola No es necesario mover todos los elementos
Implementación con arreglos #define QUEUESIZE 100 struct Queue{ int front; int rear; int nodes[QUEUESIZE]; }; struct Queue *create_queuek (struct Queue *ps) { ps = (struct Queue *) malloc(sizeof(struct Queue)); ps->front = 0; ps->rear = -1; return ps; } main(){ struct Queue *ps; ps=create_queue(ps); : } • Una cola es una colección ordenada de objetos. • En C, los arreglos permiten almacenar colecciones ordenadas. • Misma desventaja: los arreglos tienen tamaño fijo. • Uso eficiente mediante un arreglo circular.
Las operaciones básicas void enqueue(struct Queue* ps, int i) { if (ps->rear == (QUEUESIZE -1)) printf(“Full queue\n"); else { ps->rear++; ps->nodes[ps->rear] = i; } } DEQUEUE ENQUEUE int dequeue (struct Queue *ps) { if (ps->front == ps->rear + 1) printf(“Empty stack\n"); else { int t= ps->nodes[ps-> front]; ps->front++; return t; } } NO se tiene un arreglo circular, ¿qué hacer?
Colas circulares • El objetivo de una cola circular es aprovechar al máximo el espacio del arreglo. • La idea es insertar elementos en las localidades previamente desocupadas. • La implementación tradicional considera dejar un espacio entre el frente y la cola. e g f c d b a frente cola e g f frente cola e g f i h frente cola
Aplicaciones de las colas • En general, operaciones en redes de computadoras • Trabajos enviados a una impresora • Solicitudes a un servidor. • Clientes solicitando ser atendidos por una telefonista • Simulaciones de cualquier situación real en la que se presente una “organización” tipo cola