Cap Tulo 4 - TDA Pila y TDA Cola

download Cap Tulo 4 - TDA Pila y TDA Cola

of 12

Transcript of Cap Tulo 4 - TDA Pila y TDA Cola

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    1/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    1

    CAPITULO 4: Pilas y Colas

    4.1TDA Pila o Stack

    La pila es una clase particular de lista en donde todas las inserciones, eliminaciones y

    recuperaciones ocurren en un extremo de la lista (tope). Otros nombres son listas tipo

    LIFO (last in first out), que significa ltimo e entrar primero en salir.

    4.1.1 Definicin del TDA Stack

    Dominio

    D={Stack, dato, boolean}, con los siguientes objetos:

    S: Lista tipo Stack.

    x: Objeto tipo dato.

    V,F: Valores lgicos.

    Funciones

    Se definen las siguientes funciones:

    1. anular(S)=>S: Vaca el stack S.2. tope(S)=>x: Devuelve el elemento que est en el tope del stack.3. pop(S)=>S: Elimina el elemento que est en el tope del stack.4. push(x,S)=>S: Inserta el elemento en el tope del stack.5. esVacia(S)=>{V,F}: Devuelve verdadero si la pila est vaca y falso si no lo

    est.

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    2/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    2

    4.1.2 Implementacin de Pilas

    a) Implementacin por arreglos

    Se define la estructura:

    struct pila{

    int tope;

    tipo_elem elem[LONG_MAX];

    };

    El tope corresponde a la posicin del primer elemento del stack.

    9

    8

    7

    6

    5

    4

    3 x

    2 C

    1 B

    0 A

    Creacin de la pila

    struct pila *crear(){

    struct pila *pt;

    pt=(struct pila *) malloc(sizeof(srtucr pila));

    pt tope=-1;

    return(pt);

    }

    Tope=3

    PUSH POP

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    3/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    3

    Ejemplo 1:Verificacin pila vaca

    boolean esVacia(struct pila *pt){

    if (pt tope==-1)

    return true;

    else

    return false;

    }

    Ejemplo 2:Funcin almacenar en el tope: PUSH

    struct pila *push(tipo_elem x, struct pila *stack){

    if(stack tope >= LONG_MAX-1)

    printf(Stack Lleno);

    else {

    stack tope++;

    stackelem[stack tope]=x;

    }

    return (stack);

    }

    Ejemplo 3:Funcin eliminar del tope: POP

    tipo_elem pop(struct pila *stack){

    if(esVacia(stack)){

    printf(Stack Vacio);

    return NULL;

    }

    else{

    x=stackelem[stacktope];

    stack tope--;

    return(x);

    }

    }

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    4/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    4

    b) Implementacin por listas enlazadas

    Se utiliza la siguiente estructura:

    struct pila{

    tipo_elem elem;

    struct pila *sgte;

    };

    Las pilas se implementan como una lista enlazada simple con cabeza, la cual, apunta al

    tope del stack.

    Creacin de la pila

    struct pila *crear(){

    struct pila *pt;

    pt=(struct pila *)malloc(sizeof(struct pila));

    ptsgte=NULL;

    return pt;

    }

    Ejemplo 1: Verificar pila vaca

    boolean esVacia(struct pila *stack){

    if (stacksgte ==NULL)

    return true;

    else

    return false;

    }

    a3 a2 a1Cabeza TOPE

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    5/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    5

    Ejemplo 2: Funcin PUSH

    struct pila *push(tipo_elem x, struct pila *stack){

    struct pila *nodo;

    nodo =crear();

    nodoelem=x;

    nodosgte=stacksgte;

    stacksgte=nodo;

    return stack;

    }

    Ejemplo 3:Funcin POP

    struct pila *pop(struct pila *stack){

    struct pila *temp;

    if (esVacia(stack)){

    printf(Stack Vacio);

    return NULL;

    }

    else{

    temp=stacksgte;

    stacksgte=tempsgte;

    free(temp);

    return(stack);

    }

    }

    4.1.3 Aplicaciones de las pilas

    Las pilas, a pesar de la simplicidad de su estructura, tienen mltiples aplicaciones. Se

    usa entre otras cosas para:

    Realizar llamadas a subrutinas Manejar funciones recursivas Evaluacin de operaciones aritmticas Recorrido de rboles y grafos

    En general, las aplicaciones de las pilas tienen como concepto comn la idea de

    almacenar una situacin, o dejar algo pendiente, mientras se resuelve otra parte delproblema.

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    6/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    6

    Ejemplo1:Cada vez que se llama a un subprograma (subrutina o funcin) es necesario

    guardar el estado del programa que realiza la llamada:

    Direccin del programa a la que debe volver cuando termine. Las variables del programa, junto con sus valores antes de la llamada.

    El entorno del programa se guarda en una pila. Esta operacin ser especialmente

    importante cuando se realicen llamadas recursivas. En estos casos, si no se realiza un

    control del tamao de la pila puede producirse un desbordamiento.

    Funcin Factorial Recursiva

    .

    .

    .

    .

    .

    (n-1)*fact(n-2)

    return;

    n*fact(n-1)

    return;

    f=fact(n)

    Segunda Instancia

    Primera Instancia

    Llamada Principal

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    7/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    7

    Ejemplo 2: Evaluacin de expresiones aritmticas en notacin post fija. Evaluar la

    expresin (4*5)+(6*7) = 45*67*+

    Para realizar esto se lee la entrada elemento a elemento , si es un operando se mete en

    la pila (PUSH(x,S)) y si es un operador, se sacan los operandos se realiza la operacin y

    se guarda el resultado en la pila.

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    8/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    8

    4.2TDA Colas o Queues

    Las colas son casos particulares de lista en donde los elementos son insertados en un

    extremo (atrs) y se eliminan en el otro extremo (adelante). Esto corresponde a las listas

    FIFO (first in first out) que significaprimero en entrar primero en salir.

    4.2.1 Definicin del TDA Cola o Queue

    Dominio

    D={cola, dato, boolean}, con los siguientes objetos:

    Q: Lista de tipo cola.

    x: objeto tipo dato.

    V,F: valores lgicos.

    Funciones

    1. anular(Q)=>Q: Vaca la cola.2. frente(Q)=>x: Devuelve el elemento que est en el frente de la cola.3. enqueue(x,Q)=>Q: Inserta el elemento al final de la cola.4. dequeue(Q)=>Q: Elimina el elemento del principio o frente de la cola.5. esVacia(Q)=>{V,F}: Devuelve verdadero si la cola est vaca y falso si no lo

    est.

    4.2.2 Implementacin del TDA Cola

    a) Implementacin por arreglosEn esta implementacin se puede usar 2 cursores apuntando hacia adelante y atrs.

    Adelantese hace por convencin siempre uno menos que el frente real, de modo que si

    adelantees igual a atrsla cola est vaca.

    Declaraciones

    struct cola{

    tipo_elem elem[LONG_MAX];

    int adelante, atras;};

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    9/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    9

    Creacin de la cola

    struct cola *crear(){

    struct cola *q;

    q=(struct cola *)malloc(sizeof(struct cola));

    qadelante=-1;

    qatras=-1;

    return q;

    }

    Ejemplo 1:Verificacin cola vaca

    boolean esVacia(struct cola *q){

    if(qadelante==qatras)

    return true;

    else

    return false;

    }

    Ejemplo 2:Funcin almacenar al final Enqueue

    struct cola *enqueue(tipo_elem x, struct cola *q){

    if(qatras==LONG_MAX-1)

    printf(Cola Llena);

    else{

    qatras++;

    qelem[qatras]=x;

    }

    return q;

    }

    Adelante =-1 a b c d e x

    Atrs=5 0 1 2 3 4 5 6 7 8 9

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    10/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    10

    Ejemplo 3:Funcin eliminar desde el frente de la cola Dequeue.

    struct cola *dequeue(struct cola *q){

    if(esVacia(q))

    printf(Cola vaca);

    else

    qadelante++;

    return q;

    }

    b) Implementacin por listas enlazadasAl igual que en las pilas, cualquier implementacin de lista es utilizable para realizar

    una cola. Sin embargo, conviene aprovechar el hecho que insercin y eliminacin

    ocurre siempre en el mismo lugar (extremos de la cola). Para evitar tener que recorrer la

    lista cada vez que se requiere insertar algo al final es recomendable mantener un puntero

    al ltimo elemento igual que al primero como lo hace cualquier lista.

    Se utiliza la siguiente estructura para los nodos.

    struct lista{

    tipo_elem elem;

    struct lista *sgte;

    };

    Para manejar la cola se usa una estructura con dos punteros

    struct cola {

    struct lista *adelante, atrs;

    };

    a1 a2 a3

    Cabeza

    Primero ltimo

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    11/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    11

    Habitualmente se utiliza la implementacin de listas simplemente enlazadas con cabeza.

    De este modo se facilita la operacin de agregar un elemento, al no tener que

    preocuparse del caso especial, cuando la cola este vaca.

    Creacin de la cola

    struct cola *crear(){

    struct cola *Q;

    struct lista *nodo;

    Q=(struct cola *)malloc(sizeof(struct cola));nodo=(struct lista*) malloc(sizeof(struct lista));

    Qadelante=nodo;

    Qatras=nodo;

    nodosgte=NULL;

    return (Q);

    }

    Ejemplo 1: Verificacin Cola vaca

    boolean esVacia(struct cola *Q){

    if( Qadelante ==Qatras)

    return true;

    else

    return false;

    }

    Ejemplo 2:Agregar al final de la lista Enqueue

    struct cola *enqueue(tipo_elem x, struct cola *Q){

    struct lista *nodo=(struct lista *)malloc(sizeof(struct lista))

    nodosgte=NULL;

    nodoelem=x;

    Qatrassgte=nodo;

    Qatras=nodo;

    return (Q);

    }

    Cabeza 0AdelanteAtrs

    Q

  • 7/13/2019 Cap Tulo 4 - TDA Pila y TDA Cola

    12/12

    Estructuras de Datos Marcela Muoz - Claudio Henrquez

    12

    Ejemplo 3:Funcin eliminar desde el frente de la cola Dequeue.

    struct cola *dequeue(struct cola *Q){

    struct cola *temp;

    if(esVacia(Q))

    printf(Cola Vacia);

    else{

    temp=Qadelantesgte;

    Qadelantesgte=Qadelantesgtesgte;

    free(temp);

    }

    return (Q);

    }

    4.3.3 Aplicaciones TDA Cola

    Algunas aplicaciones de las colas son:

    1.

    Para modelar 'colas reales' en el mundo de las computadoras: Colas deimpresin, Colas de tareas, Colas de procesos.

    2. Simulaciones.3. Bsqueda en achura.

    CabezaAdelanteAtrs

    Q

    a x

    CabezaAdelanteAtrs

    Q

    a x

    temp