Sei sulla pagina 1di 47

Estructuras de Datos Lineales

Pilas y Colas

Karim Guevara Puente de la Vega


kguevara72@gmail.com UNSA, 2013

Objetivos

El objetivo general de este tema es presentar algunas de las estructuras de datos lineales ms utilizadas:

La EDAs Pila, que proporciona una gestin LIFO (Last In First Out) de los datos La EDAs Cola, que proporciona una gestin FIFO (First In First Out) de los datos

Estructura de Datos I

Agenda

Pilas

Definicin y uso Implementacin de la Pila Aplicaciones Definicin y uso Implementacin de la Cola

Colas

Estructura de Datos I

PILA
Definicin

Es una lista lineal en que todas las inserciones, eliminaciones y, generalmente, todos los accesos son hechos en apenas un extremo de la lista. Los items son colocados uno sobre el otro. El item insertado ms recientemente est en el fondo. El modelo intuitivo es el de varios platos colocados uno encima del otro, siendo conveniente retirar o adicionar platos en la parte superior
Estructura de Datos I

PILAS
Propiedades y Aplicaciones

Propiedad: el ltimo item insertado es el primer item que puede ser retirado de la lista. Son llamadas listas lifo (last-in, first-out). Existe un orden lineal para pilas, del .ms reciente para el menos reciente. Es ideal para el procesamiento de estructuras anidadas de profundidad imprevisible.

Estructura de Datos I

PILAS
Propiedades y Aplicaciones

Aplicaciones en estructuras anidadas:

Cuando es necesario explorar en conjuntos de datos y guardar una lista de cosas a realizar posteriormente. El control de secuencias de llamadas a subprogramas. La sintaxis de expresiones aritmticas.

Las pilas ocurren en estructuras de naturaleza recursiva (como rboles). Ellas son utilizadas para implementar la recursividad

Estructura de Datos I

TAD PILA
Conjunto de Operaciones

push : colocar un elemento pop: eliminar un elemento top: Recupera el elemento del Tope/cima de la pila inicializaStack: inicializa la pila en un estado inicial vacoTAD Pila destroyStack: Elimina todos los elementos, dejando la pila vaca isEmptyStack: verifica si la pila esta vaca isFullStack: verifica si la pila esta llena
Estructura de Datos I

TAD PILA
Implementacin

Existen varias opciones de estructuras de datos que pueden ser usadas para representar pila. Las dos representaciones ms utilizadas:

Por medio de arreglos Estructuras auto-referencias.

Estructura de Datos I

TAD PILA
Implementacin con arreglos

Como las inserciones y eliminaciones ocurren en la cima de la pila, un cursor llamado tope es utilizado para controlar la posicin del item en la cima de la pila

Una representacin sencilla de los datos de un Pila genrica es un array genrico en el que se mantenga una referencia al tope
Estructura de Datos I

LA CLASE StackType
Atributos

arrayStack, un array genrico para almacenar de forma contigua los datos de la Pila. Para apilar en tiempo constante se debe insertar siempre en la primera posicin libre del array maxStackSize, define la capacidad inicial del array stackTop, un int que seala la posicin en el array del dato situado en el tope de la Pila

Es la ltima posicin del array ocupada

Inicialmente su valor ser de -1


En cualquier momento stackTop+1 ser igual al tamao de la Pila
Estructura de Datos I

10

LA CLASE StackType
Implementacin con arreglos
template<class E> class StackType: public listDinamicType<E>{ public: void initializeStack(); void destroyStack(); void push(const E& newItem); E top(); void pop(); StackType(int ); StackType(StackType<E>& otherStack); ~StackType(); };

11

Estructura de Datos I

LA CLASE StackType
Implementacin con arreglos
template<class E> void StackType<E>::push(E& newItem){ insert(newItem) } template<class E> void StackType<E>::pop(){ if(!isEmpty()) lenght--; else cout<<Pila esta vaca."<<endl; } template<class E> StackType<E>::~StackType() :listDinamicType<E>::~listDinamicType(){ }

12

Estructura de Datos I

LA CLASE StackType
Implementacin con arreglos
template<class E> E StackType<E>::top(){ assert(lenght != 0); return list[lenght - 1]; } template<class E> StackType<E>::StackType(int stackSize) :listDinamicType<E>::listDinamicType(stackSiz e){}

13

Estructura de Datos I

TAD PILA
Implementacin con estructuras auto referenciadas

Hay un nodo cabeza en la cima/tope para facilitar la implementacin de las operaciones empilar y desempilar. Para desempilar el item xn , desligar el nodo cabeza de la lista y el nodo que contiene xn-1 pasa a ser el nodo cabeza. Para empilar un nuevo item, crear un nuevo nodo cabeza y colocar el nuevo item antes de aquel que era cabeza.
fondo

tope Xn Xn-1 Xn-2 ... X1


NULL

14

Estructura de Datos I

LA CLASE StackType
Implementacin con estructuras auto referenciadas
template<class E> class StackType : public LEG<E>{ public: StackType(); void push(E); void pop(); E top(); void destroyStack(); ~StackType(); };

15

Estructura de Datos I

LA CLASE StackType
Implementacin con estructuras auto referenciadas
template<class E> void StackType<E>::StackType(): LEG<E>::LEG(){}

template<class E> void StackType<E>::destroyStack() { NodoLEG<E> *tem; while(primero){ tem=primero; primero=primero->siguiente; delete tem; } }
16 Estructura de Datos I

LA CLASE StackType
Implementacin con estructuras auto referenciadas
template<class E> StackType<E>::~StackType() { destroyStack(); } template<class E> void StackType<E>::push(E item) { insertar(item); } template<class E> void StackType<E>::pop() { assert(primero!=NULL); NodoLEG<E> *tem=primero; primero=primero->siguiente; delete tem; }

17

Estructura de Datos I

LA CLASE StackType
Implementacin con estructuras auto referenciadas
template<class E> E StackType<E>::top() { assert(primero!=NULL); return primero->dato; }; template<class E> bool StackType<E>::isEmpty() { return (primero==NULL); };

18

Estructura de Datos I

Ejercicios

Ejercicio 1: Escriba el copyStack, que permita realizar la

copia entre pilas: 1. Por medio de arreglos 2. Por medio de listas enlazadas

Ejercicio 2: Enriquecer las clases StackType con dos nuevas operaciones:

Type borraBase(), que borra el dato situado en la base dela Pila

void topeBase(), que intercambia el dato que ocupa el tope/cima de la Pila con el que ocupa su base
Estructura de Datos I

19

Pilas: aplicaciones
Expresiones aritmticas Una expresin aritmtica incluye constantes y operaciones: Notacin infija:

Aquella expresin en que los operadores se colocan en medio de los operandos. P.e.: A+B C-D (A+B)*C A+(B*C)

Notacin polaca (prefija): (Jan Lukasiewicz)

Aquella en que los operadores se colocan delante de los operandos. P.e.: +AB -CD *+ABC +A*BC
Estructura de Datos I

20

Pilas: aplicaciones
Expresiones aritmticas Ejemplos (A + B) * C = [+ A B] * C = * + A B C A + (B * C) = A + [* B C] = + A * B C (A +B) / (C - D) = [+ A B] / [- C D] = / + A B C D

Propiedad:

Orden en que se realizan las operaciones est completamente determinado por las posiciones de los operandos y las operadores (no se requiere parntesis)
Estructura de Datos I

21

Pilas: aplicaciones
Expresiones aritmticas Notacin polaca inversa (postfija / sufija):

Se refiere a la notacin anloga en la que el operador se coloca tras sus dos operandos. P.e.: AB+ CD - AB+C* ABC*+

Tampoco se requiere parntesis para determinar el orden de las operaciones.


Estructura de Datos I

22

Ejercicios

Dadas las siguientes expresiones infijas, hallar por inspeccin la expresin equivalente: prefija: (AB)*(D/E) postfija. (A+BD)/(EF)+G postfija: A*(B+D)/EF*(G+H/K) Sea la siguiente expresin infija Q: 5 * ( 6 + 2) ( 12 / 4)

Hallar, por inspeccin, su equivalente expresin postfija Hallar, por inspeccin, el resultado de la expresin postfija

Sea la expresin postfija: P : 12 7 3 - / 2 1 5 + * +

Traducir P, por inspeccin, en su equivalente exp. Infija.


Estructura de Datos I

23

Pilas: aplicaciones
Expresiones aritmticas El computador evala una expresin aritmtica en notacin infija:
1.
2.

Convierte la expresin infija a postfija Evala la expresin postfija

En cada paso, la pila es una estructura fundamental

24

Estructura de Datos I

Evaluacin de expresiones postfijas


Algoritmo
EVALUA_POSTFIJA (P, PILA, VALOR) 1. Agregar un ) al final de P [evaluar P de izquierda a derecha] 2. Hacer paso 3 y 4 mientras no sea ) 3. Si se encuentra un operando, ponerlo en la PILA. 4. Si se encuentra un operador , entonces:

Sacar los dos elementos de PILA (A, B). b) Hacer Y = B A c) Poner el resultado Y a la PILA [Fin del condicional]
a)

[Fin del ciclo en 2] 5. VALOR = al elemento de la cima de PILA 6. Salir


25

P:

5 6 2 + * 12 4 / -

Estructura de Datos I

Transformacin de infija a postfija


Algoritmo
INFIJA_POSTFIJA (Q, PILA, P) 1. Meter ( en PILA y aadir ) al final de Q [evaluar Q de izquierda a derecha] 2. Hacer pasos del 3 al 6 mientras que PILA no est vaca 3. Si se encuentra un operando, aadirlo a P. 4. Si se encuentra un parntesis izquierdo (, meterlo a PILA 5. Si se encuentra un operador , entonces:
a)

[Fin del condicional en 5]


26

b)

Repetidamente sacar de PILA y aadir a P, cada operador que tenga la misma o mayor precedencia que . Aadir a PILA

Q:

A + ( B * C ( D / E F ) * D ) * H

Estructura de Datos I

Transformacin de infija a postfija


Algoritmo
INFIJA_POSTFIJA (Q, PILA, P) 6. Si se encuentra un parntesis derecho ), entonces:
a)

b)

Repetidamente sacar de PILA y aadir a P cada operador hasta que se encuentre un parntesis izquierdo (. Eliminar el parntesis izquierdo (

[Fin del condicional en 6] 7. Salir

27

Q:

A + ( B * C ( D / E F ) * D ) * H
Estructura de Datos I

COLAS

COLAS
Definicin

Es una lista lineal en que todas las inserciones son realizadas en un extremo de la lista, y todas las eliminaciones, y generalmente los accesos, son hechos en el otro extremo de la lista. El modelo intuitivo de una cola es de una fila de espera de personas. Estas estructuras se las llaman listas fifo (first-in, first-out).

29

Estructura de Datos I

COLAS
Definicin

Existe un orden lineal para las filas que es el orden de llegada. Son utilizadas cuando deseamos procesar items de acuerdo con el orden primero-que-llega, primeroatendido Sistemas operativos, utilizan colas para regular el orden en el cual las tareas deben recibir procesamiento y para ver que recursos deben ser atribuidos a los procesos.
Estructura de Datos I

30

TAD COLA - QUEUE Implementacin con arreglos

Los items son almacenados en posiciones continuas de la memoria. La operacin Inserta hace que la parte posterior de la cola se expanda. La operacin Elimina hace que la parte del frente de la fila se contraiga. La cola tiende a caminar por la memoria, ocupando espacio en la parte posterior y descartando espacio en el frente.
Estructura de Datos I

31

TAD PILA -QUEUE Implementacin con arreglos

Con pocas inserciones y eliminaciones, la cola hace uso de la memoria separada para ella Solucin: imagina un arreglo como un crculo. La primera posicin sigue a la ltima.
La cola se encuentra en posiciones continuas de memoria, delimitada por los apuntadores frente y final. Para insertar, basta con mover el apuntador final. Para eliminar, se debe de mover el apuntador frente.
Estructura de Datos I

32

LA CLASE QueueType Implementacin con arreglos


template<class E> class QueueType { public: bool isEmptyQueue(); bool isFullQueue(); void initializeQueue(); void destroyQueue(); E front(); E back(); void addQueue(const E& queueElement); void deleteQueue(); QueueType(int = 100); QueueType(const QueueType<E>& otherQueue); ~QueueType(); private: int maxQueueSize; int count; int queueFront; int queueRear; E *list; };

33

Estructura de Datos I

LA CLASE QueueType Implementacin con arreglos


template<class <E> QueueType<E>::QueueType(int size){ if(size <= 0){ cout<<"Size of the array to hold the queue must " <<"be positive."<<endl; cout<<"Creating an array of size 100."<<endl; maxQueueSize = 100; } else maxQueueSize = size; queueFront = 0; queueRear = maxQueueSize - 1; count = 0; list = new E[maxQueueSize]; assert(list != NULL); }
34

Estructura de Datos I

LA CLASE QueueType Implementacin con arreglos


template<class E> QueueType<E>::~QueueType(){ if(list) { delete [] list; iniatializeQueue(); } } template<class <E> void QueueType<E>::initializeQueue(){ queueFront = 0; queueRear = maxQueueSize - 1; count = 0; }

template<class E> bool QueueType<E>::isEmptyQueue(){ return(count == 0); }


35

Estructura de Datos I

LA CLASE QueueType Implementacin con arreglos


template<class E> bool QueueType<E>::isFullQueue(){ return(count == maxQueueSize); }

template<class <E> void QueueType<E>::addQueue(const E& newElement){ if(!isFullQueue()) { queueRear = (queueRear + 1) % maxQueueSize; count++; list[queueRear] = newElement; } else cout<<"Cannot add to a full queue"<<endl; }

36

Estructura de Datos I

LA CLASE QueueType Implementacin con arreglos


template<class E> E QueueType<E>::front(){ assert(!isEmptyQueue()); return list[queueFront]; } template<class E> E QueueType<E>::back(){ assert(!isEmptyQueue()); return list[queueRear]; } template<class E> void QueueType<E>::deleteQueue(){ if(!isEmptyQueue()){ count--; queueFront = (queueFront + 1) % maxQueueSize; } else cout<<"Cannot remove from an empty queue"<<endl; }

37

Estructura de Datos I

TAD COLA - QUEUE Implementacin con estructuras auto-referenciad.

Hay dos apuntadores First y Last que facilitan la implementacin de las operaciones de insercin y eliminacin. Para insertar un nuevo item, basta crear un nuevo nodo y ligarlo despus del nodo que contiene xn y colocar en l el nuevo item. Para eliminar el item x1 basta desligar el nodo que se encuentra al inicio de la lista. x2 pasa a ser First.
last

first
X1
38

X2

X3

...

Xn

NULL

Estructura de Datos I

Ejercicios

Escriba los mtodos que manipulen una cola por medio de listas autoreferenciadas:

Insert(newItem) Remove() Print()

39

Estructura de Datos I

Colas de Prioridad

Colas de prioridad (Priority Queues) son conjuntos de elementos donde a cada uno de los elementos se les asigna una prioridad. Son procesados de la siguiente manera:

El elemento de mayor prioridad es procesado al principio Dos elementos con la misma prioridad son atendidos de acuerdo al orden en el que llegaron

40

Estructura de Datos I

Colas de Prioridad: aplicaciones

Colas de prioridad (Priority Queues) son usadas en diversas aplicaciones:

Planificador (scheduler) de tareas Algoritmos de ordenacin Atencin de clientes

41

Estructura de Datos I

TAD Cola de Prioridad

Las operaciones ms usuales son:


Crear cola Insertar datos Remover el item con mayor prioridad Remover un item

42

Estructura de Datos I

TAD Cola de Prioridad


La operacin de insercin es igual que en las colas La operacin de eliminacin es ejecutada encontrando primero el elemento de mayor prioridad e intercambindolo con el elemento que est al inicio de la cola. En este caso la operacin de insercin es O(1) y la de eliminacin es O(n).

43

Qu hacer para que la eliminacin sea de O(1)?


Estructura de Datos I

TAD Cola de Prioridad

Implementada por medio de varias listas

44

Estructura de Datos I

TAD Cola de Prioridad

Otra forma de implementar colas de prioridad es a travs de heaps (montculos).

A travs de los heaps, se consigue un mejor equilibrio en la bsqueda y eliminacin de elementos.

45

Estructura de Datos I

TAD Cola de Prioridad

Heap: es un objeto arreglo que puede ser visto como un rbol binario completo (completamente lleno en todos los niveles, quizs, excepto en el nivel ms bajo).

Representacin rbol binario


46 Estructura de Datos I

TAD Cola de Prioridad

La raz del rbol representada por el heap es A[1] y, dado el ndice i de un nodo, los ndices del PADRE(i), del hijo izquierdo IZQUIERDA(i) y del hijo derecho DERECHA(i) son:

PADRE(i)

return i/2 ;

IZQUIERDA(i)

return 2i;

DERECHA(i)

return 2i + 1;
47 Estructura de Datos I

Potrebbero piacerti anche