ed cap4 pilascolas12010

26
Estructura de Datos Pilas – Colas Prof.: Mauricio Solar Prof.: Lorna Figueroa Primer Semestre, 2010 Universidad Técnica Federico Santa María - Departamento de Informática Indice TDA: Pilas TDA: Colas Colas de Prioridad Anillos BiColas BiColas Circulares Universidad Técnica Federico Santa María - Departamento de Informática Pilas - Stack Una de las estructuras de datos más primitivas y más antiguas en la ciencia de los computadores. A pesar de ser tan simple, es esencial en los compiladores, SS.OO., etc. Se pueden representar como una lista lineal que crece y decrece por el mismo extremo. El último elemento que se incorpora a la estructura, es el único que se puede consultar y eliminar. trabajos LIFO Entrada Salida

Upload: shassain

Post on 11-Nov-2015

216 views

Category:

Documents


1 download

DESCRIPTION

Estrucutura de datos informaticos (Pilas y Colas)

TRANSCRIPT

  • Estructura de Datos

    Pilas Colas

    Prof.: Mauricio Solar Prof.: Lorna Figueroa

    Primer Semestre, 2010

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Indice

    TDA: Pilas TDA: Colas Colas de Prioridad Anillos BiColas BiColas Circulares

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Pilas - Stack

    Una de las estructuras de datos ms primitivas y ms antiguas en la ciencia de los computadores.

    A pesar de ser tan simple, es esencial en los compiladores, SS.OO., etc.

    Se pueden representar como una lista lineal que crece y decrece por el mismo extremo. El ltimo elemento que se incorpora a la estructura, es el

    nico que se puede consultar y eliminar.

    trabajos

    LIFOEntradaSalida

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Pilas - Stack

    Es un tipo lineal de datos, secuencia de elementos de un tipo, una estructura tipo LIFO (Last In First Out) ltimo en entrar primero en salir.

    Son un subconjunto de las listas, en donde las eliminaciones e inserciones se realizan en un solo extremo.

    trabajos

    LIFOEntradaSalida

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Aplicaciones de las Pilas

    Aplicaciones Directas: Histrico de pginas visitadas en un browser de web. Secuencia de undo en un editor de textos. Cadena de llamadas a mtodos en JVM o medioambiente

    runtime en C++ Parsers en Compiladores (reconocedores sintcticos). SSOO. Convertir notacin infija a posfija o prefija. Implementacin de recursividad.

    Aplicaciones Indirectas: Estructuras de datos auxiliares para algoritmos Componentes de otras estructuras de datos.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Ejemplo Aplicacin de las pilas

    Suponga que se quiere evaluar una expresin aritmtica, mediante un proceso que se basa en guardar dicha expresin en dos pilas: una de operadores (+, -, * y /) y otra de operandos (nmeros naturales).

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Ejemplo Aplicacin de las pilas

    El mtodo consiste en seguir el siguiente proceso de forma reiterada:

    1. Si la pila de operadores est vaca, la cima de la de operandos contiene el resultado final.

    2. En caso contrario, tomar los dos operandos de la cima de la pila y operarlos segn el operador de la cima de la otra pila. El resultado colocarlo en la cima de la pila de operandos.

    *-+

    4231

    -+

    831 +

    51 9

    Iteracin 1 Iteracin 2 Iteracin 3

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Definicin del TAD Pilas

    Se definir la semntica de las operaciones del TDA Pila en trminos de las operaciones del TDA Lista.

    Operaciones: CrearPilaVaca( P ) PilaVaca( P ) B Apilar( x, P ) Desapilar( P ) Tope( P ) E

    apilar desapilar

    tope

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Definicin del TAD Pilas

    CrearPilaVaca: Pila Pila CrearPilaVaca(P) = CrearListaVaca(P)

    Invocacin: CrearPilaVaca(P)

    CrearPilaVaca: Pila Pila CrearPilaVaca(P) = CrearListaVaca(P)

    Invocacin: CrearPilaVaca(P)

    PilaVaca: Pila Lgico PilaVaca(P) = ListaVaca(P)

    Invocacin: PilaVaca(P)

    PilaVaca: Pila Lgico PilaVaca(P) = ListaVaca(P)

    Invocacin: PilaVaca(P)

    Apilar: Elemento x Pila Pila Apilar( x, P ) = Insertar( x, Primera(P), P )

    Invocacin: Apilar(x,P)

    Apilar: Elemento x Pila Pila Apilar( x, P ) = Insertar( x, Primera(P), P )

    Invocacin: Apilar(x,P)

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Definicin del TAD Pilas

    Desapilar: Pila Pila

    Desapilar( P ) {Si (no ListaVaca(P))

    Eliminar( Primera(P), P )sino Error

    }

    Invocacin: Despilar(P)

    Desapilar: Pila Pila

    Desapilar( P ) {Si (no ListaVaca(P))

    Eliminar( Primera(P), P )sino Error

    }

    Invocacin: Despilar(P)

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Definicin del TAD Pilas

    Tope: Pila Elemento

    Tope( P ) {Si (no ListaVaca(P))

    Retornar( Recuperar(Primera(P), P) )Sino Error

    }

    Invocacin: Tope(P)

    Tope: Pila Elemento

    Tope( P ) {Si (no ListaVaca(P))

    Retornar( Recuperar(Primera(P), P) )Sino Error

    }

    Invocacin: Tope(P)

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Aplicaciones con TAD Pila

    void MostrarPila(Pila P) {Pila p1;CrearPilaVacia( p1 )PasarPila( P, p1 ) // definirlamientras no PilaVacia( p1 ) {

    Imprimir( Tope(p1) )Apilar( Tope(p1), P )Desapilar( p1 )

    }}

    void MostrarPila(Pila P) {Pila p1;CrearPilaVacia( p1 )PasarPila( P, p1 ) // definirlamientras no PilaVacia( p1 ) {

    Imprimir( Tope(p1) )Apilar( Tope(p1), P )Desapilar( p1 )

    }}

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Pila PasarPila( Pila Origen ) {Pila Dest;mientras (no PilaVacia( Origen ))

    Apilar( Tope(Origen), Dest )Desapilar( Origen )

    }return Dest;

    }

    Pila PasarPila( Pila Origen ) {Pila Dest;mientras (no PilaVacia( Origen ))

    Apilar( Tope(Origen), Dest )Desapilar( Origen )

    }return Dest;

    }

    Aplicaciones con TAD Pila

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    PILAS

    La representacin grfica de una pila es como la de cualquier estructura dinmica:

    ...

    tope

    NULL

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    PILAS Implementaciones

    typedef struct nodoP {tElemento info;struct nodoP* sig;

    }

    Las pilas se implementan como una lista enlazada simple. El puntero de la lista (el tope) apunta al primer nodo de la

    pila.

    pila

    tope a1 a2 an.

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    boolean EstaVacia (struct nodoP* tope) {return (tope sig = = NULL);// Verdadero si est vaca

    }

    boolean EstaVacia (struct nodoP* tope) {return (tope sig = = NULL);// Verdadero si est vaca

    }

    PILAS Implementaciones

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    PILAS Implementaciones

    void Push (tElemento x, struct nodoP* tope) {struct nodoP* q;q = (struct nodoP*) malloc (sizeof (struct nodoP));q info = x; // almacena el elemento q sig = tope; // enlaza al nodo con el resto tope = q; // y lo pone en la cabeza

    }

    void Push (tElemento x, struct nodoP* tope) {struct nodoP* q;q = (struct nodoP*) malloc (sizeof (struct nodoP));q info = x; // almacena el elemento q sig = tope; // enlaza al nodo con el resto tope = q; // y lo pone en la cabeza

    }

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    tElemento Pop (struct nodoP* tope) {struct nodoP* temp;

    tElemento x;if (EstaVaca(tope))

    printf (Error: pila vaca);else {

    x = tope info;temp = tope; // Se eliminar el tope tope = tope sig;free(temp);return(x);

    }}

    tElemento Pop (struct nodoP* tope) {struct nodoP* temp;

    tElemento x;if (EstaVaca(tope))

    printf (Error: pila vaca);else {

    x = tope info;temp = tope; // Se eliminar el tope tope = tope sig;free(temp);return(x);

    }}

    PILAS Implementaciones

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Ejemplo

    10 10

    100

    10

    100

    1000

    10

    100

    10

    100

    1

    10

    100

    push(10) push(100) push(1000) pop() push(1) pop()

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Expresiones infijas, prefijas, postfijas

    Ejemplo de suma de dos operandos: Infija A + B (operador va entre operandos ) Prefija o polaca + A B (operador va antes que

    operandos) Postfija o polaca inversa A B + (operador va despus de

    operandos) Solo existe una expresin prefija y una postfija para cada

    expresin algebraica. Para evaluar estas expresiones se usan las pilas.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Notacin polaca inversa (postfija)

    Para evaluar la expresin aritmtica:

    Se sigue el orden indicado por las flechas, (segn prioridad de operadores y uso de parntesis).

    2b b 4 a c2 a

    (b + (b^2 4 * a * c) ^ 0.5) / (2 * a)

    6 1 4 2 3 5 8 7

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Notacin polaca inversa (postfija)

    Para eliminar esta dificultad, se hace una traduccin de las expresiones aritmticas a notacin postfija.

    Esta notacin tiene la ventaja de que las operaciones aparecen en el orden en que se efecta realmente la evaluacin.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Notacin postfija

    La idea bsica detrs de la notacin de cadenas polacas es que los operadores se escriben al final y no en medio de las expresiones. A + B se escribe como A B +. En esta forma, el operador + se considera como una

    instruccin para sumar los valores de las dos variables que lo preceden inmediatamente. Ejemplo:

    La clave de la traduccin de notacin infija a posfija es la prioridad de los operadores: ( ), + -, * /, ^

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Notacin postfija

    Reglas bsicas para convertir expresiones infijas a posfijas:1. Si el elemento es un ( se coloca directamente en la pila de

    operadores.2. Si el elemento es un ), los operadores de la pila se transfieren

    uno a uno, al extremo derecho de la expresin posfija hasta llegar a un (. Este se saca pero no va a la salida.

    3. Si el elemento localizado es una variable, se coloca inmediatamente en el extremo derecho de la expresin posfijaque se est creando.

    4. Si el elemento es un operador y es de menor precedencia que el operador en la pila, el operador de la pila se saca y va a lasalida, continuando de esta manera hasta encontrar un ( o hasta que el operador de la pila sea de menor precedencia. Cuando esto ocurre, el operador en turno se apila.

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Conversin infija a postfija

    Ecuacin cuadrtica

    En notacin infija:

    ( -b + ( b ^ 2 4 * a * c ) ^ ( 1 / 2 ) ) / ( 2 * a )

    En notacin postfija:

    -b b 2 ^ 4 a c * * 1 2 / ^ + 2 a * /

    2b b 4 a c2 a

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    1. Implementar la pila 2. Repetir hasta encontrar el fin de la expresin postfija

    Tomar un carcter. Si el carcter es un operando colocarlo en la pila. Si el carcter es un operador entonces sacar los dos

    valores del tope de la pila (operando2 operando1), aplicar el operador (operando1 operador operando2) y colocar el resultado en el nuevo tope de la pila.

    Estructura de datos y organizacin de archivos. Mary E. Loomis. Prentice Hall. 2a Ed.

    www.itlp.edu.mx/publica/tutoriales/estru1/33.htmthales.cica.es/rd/Recursos/rd99/ed99-0636-03/notacion_polaca.html

    Algoritmo

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Para evaluar una expresin postfija con pilas:i = 1Mientras i < Longitud(expresion)

    si expresin[i] es operandoInsertar expresion[i] en la pila

    sino {es operador}Extraer dos elementos de la pilaoperarlos segn el operador,insertar el resultado de nuevo en la pila

    FinMientrasvalor = cimaPila

    Algoritmo para evaluar una expresin postfija

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Aplicacin: Invertir una Pila

    nodoP InvPila(nodoP *tope) {

    // Funcin que invierte una pilatElemento x;nodoP *tope1;while( !EstaVacia(tope) ) {

    x = Pop(tope); Push(x, tope1);

    }return(tope1);

    }

    nodoP InvPila(nodoP *tope) {

    // Funcin que invierte una pilatElemento x;nodoP *tope1;while( !EstaVacia(tope) ) {

    x = Pop(tope); Push(x, tope1);

    }return(tope1);

    }

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Implementacin en C

    #include #include

    typedef struct nodoP {int valor;struct nodoP *sig;

    } tipoNodo;

    typedef tipoNodo *pNodo;typedef tipoNodo *Pila;

    // Prototipo de las funciones void Push(Pila *p, int x);int Pop(Pila *p);

    #include #include

    typedef struct nodoP {int valor;struct nodoP *sig;

    } tipoNodo;

    typedef tipoNodo *pNodo;typedef tipoNodo *Pila;

    // Prototipo de las funciones void Push(Pila *p, int x);int Pop(Pila *p);

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Ejemplo

    Algoritmo para encontrar el factorial de un nmero mediante pilas

    leer n;mientras n > 1 {push(n);n = n-1;

    }factorial = 1;mientras pila no est vaca

    factorial = factorial * pop();

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Ejercicios

    1. Evaluar, indicando en cada paso el estado de la pila:Pila p = (Pila *)malloc(sizeof(Pila));

    a) Pop ( Pop ( Push ( 3, Pop ( Push ( 4, Push ( 5, Push ( 6, p ) ) ) ) ) ) )

    b) EstaVacia(Pop(Pop(Push( 8,p))))

    c) InvPila( Push ( 3, Pop ( Push ( 4, Push ( 5, Push ( 6, p ) ) ) ) ) ) ) )

    2. Escribir una funcin que permita contar todos los elementos pares que estn en una pila dada.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    COLASCOLAS

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas - queue

    Es una abstraccin til con muchos paralelismos en la vida real: colas de espera en bancos, supermercados, etc Ello hace que su importancia sea crucial en simulaciones.

    Computacionalmente hay muchos casos en los que aparecen colas de espera, por ejemplo: Procesos que esperan a ser ejecutados en sistemas

    multitarea Procesos batch de clculo intensivo Acceso a recursos compartidos (impresora)

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas - queue

    Aplicaciones Indirectas:

    Estructuras de datos auxiliares para algoritmos. Componentes de otras estructuras de datos.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas

    Tipo de dato lineal con estructura FIFO (First In, First Out),indica que el primer elemento que se incorpor a la estructura, ser el primero que salga, y el nico que se puede consultar en un momento dado.

    trabajos

    entrada

    salida

    FIFO

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas

    Las colas son un subconjunto de las listas, en donde las eliminaciones se dan al comienzo de la lista y las inserciones al final.

    Los elementos se procesan en el orden como se reciben (similar a la cola de impresin en redes).

    Cuando se desea accesar un elemento que no est en un extremo, obligadamente se debe realizar una operacin desplazamiento de los nodos anteriores (o posteriores) a l.

    trabajos

    entrada

    salida

    FIFO

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Definicin del TAD Cola

    CrearColaVaca( C ) ColaVaca( C ) B PonerEnCola( x, C ) SacarDeCola( C ) Frente( C ) E

    encolar

    desencolar

    final

    frente

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Definicin del TAD Cola

    CrearColaVaca: Cola Cola CrearColaVaca(C) = CrearListaVaca(C)

    Invocacin: CrearColaVaca(C)

    CrearColaVaca: Cola Cola CrearColaVaca(C) = CrearListaVaca(C)

    Invocacin: CrearColaVaca(C)

    ColaVaca: Cola LgicoColaVaca(C) = ListaVaca(C)

    Invocacin: ColaVaca(C)

    ColaVaca: Cola LgicoColaVaca(C) = ListaVaca(C)

    Invocacin: ColaVaca(C)

    PonerEnCola: Elemento x Cola Cola PonerEnCola( x, C ) = Insertar( x, Fin(C), C )

    Invocacin: PonerEnCola(x, C)

    PonerEnCola: Elemento x Cola Cola PonerEnCola( x, C ) = Insertar( x, Fin(C), C )

    Invocacin: PonerEnCola(x, C)

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Definicin del TAD Cola

    SacarDeCola: Cola Cola

    SacarDeCola( C ) {Si (no ListaVaca(C))

    Eliminar( Primera(C), C )sino Error

    }

    Invocacin: SacarDeCola (C)

    SacarDeCola: Cola Cola

    SacarDeCola( C ) {Si (no ListaVaca(C))

    Eliminar( Primera(C), C )sino Error

    }

    Invocacin: SacarDeCola (C)

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Definicin del TAD Cola

    Frente: Cola Elemento

    Frente( C ) {Si (no ListaVaca(C))

    retornar( Recuperar(Primera(C), C) )Sino Error

    }

    Invocacin: Frente(C)

    Frente: Cola Elemento

    Frente( C ) {Si (no ListaVaca(C))

    retornar( Recuperar(Primera(C), C) )Sino Error

    }

    Invocacin: Frente(C)

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas - Implementacin

    Estructura para los nodos:

    typedef struct TColas {tElemento info;struct tColas* sig;

    }TColas *tCola;

    info sig

    Entrada de Dato

    Salida de Dato

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas

    Representacin grfica:

    ...

    frente

    NULL

    final

    Por aqu se sale Por aqu entran

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas

    Otra representacin:

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas

    Se dispone de un puntero ms. Cuando la cola est vaca se tiene la siguiente situacin:

    frente

    NULL

    final

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    ColasINSERTAR(dato;frente;final) {

    Nuevo(p); p->info = dato;

    if final = = NULL {frente = p; // 1afinal = p; // 2a

    }

    else {final->sig = p; // 1bfinal = p; // 2b

    }

    p->sig = null; // 3}

    INSERTAR(dato;frente;final) {Nuevo(p); p->info = dato;

    if final = = NULL {frente = p; // 1afinal = p; // 2a

    }

    else {final->sig = p; // 1bfinal = p; // 2b

    }

    p->sig = null; // 3}

    p

    dato

    final

    frente

    p

    datonull

    31a

    2a

    3

    ...

    frente 1bnull

    finalp

    dato

    2b

    final

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas

    Algoritmo Eliminar(frente) {if frente = = NULL

    cola vaca

    else {p = frente; // 1frente = frente->sig; // 2free(p); // 3

    }}

    Algoritmo Eliminar(frente) {if frente = = NULL

    cola vaca

    else {p = frente; // 1frente = frente->sig; // 2free(p); // 3

    }}

    ...

    frente

    1 null

    finalfrente23

    p

    frente null

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas - Implementacin

    boolean EstaVaca (tCola **frente, tCola **final) {// Verificacin de cola vaca

    if ((*final == NULL) && ( *frente == NULL))return( true); // Verdadero si est vaca

    elsereturn (false);

    }

    boolean EstaVaca (tCola **frente, tCola **final) {// Verificacin de cola vaca

    if ((*final == NULL) && ( *frente == NULL))return( true); // Verdadero si est vaca

    elsereturn (false);

    }

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas - Implementacin

    void Enqueue (tCola **frente ,tCola **final) { tElemento dato;printf("Ingrese elemento "); scanf("%d",&dato);if( *frente == NULL) {

    *frente=(tCola *) malloc(sizeof(tCola));(*frente)->info = dato; // los parntesis son requeridos por(*frente)->sig = NULL; // precedencia de operandos *final = *frente;

    }else {

    tCola *q = (tCola *) malloc (sizeof (tCola) );q->info= dato;q->sig = NULL;*final = (*final)->sig = q;

    }}

    void Enqueue (tCola **frente ,tCola **final) { tElemento dato;printf("Ingrese elemento "); scanf("%d",&dato);if( *frente == NULL) {

    *frente=(tCola *) malloc(sizeof(tCola));(*frente)->info = dato; // los parntesis son requeridos por(*frente)->sig = NULL; // precedencia de operandos *final = *frente;

    }else {

    tCola *q = (tCola *) malloc (sizeof (tCola) );q->info= dato;q->sig = NULL;*final = (*final)->sig = q;

    }}

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    tElemento Dequeue (TCola **top, TCola **final) {tCola *temp;if (EstaVacia(frente,final))

    printf("Error (cola vacia)");else {

    tElemento x=(*frente)->info;temp = *frente;*frente = (*frente)-> sig;temp->sig=NULL;free(temp);return(x);

    }}

    tElemento Dequeue (TCola **top, TCola **final) {tCola *temp;if (EstaVacia(frente,final))

    printf("Error (cola vacia)");else {

    tElemento x=(*frente)->info;temp = *frente;*frente = (*frente)-> sig;temp->sig=NULL;free(temp);return(x);

    }}

    Colas - Implementacin

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Ejemplo

    a

    a b

    a b c

    b c

    No es necesario movertodos los elementos

    a b

    a b c

    b c

    Apuntadores al frentey al final

    a

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Colas - Ejercicios

    Escribir una funcin que, dada una cola que almacena nmeros enteros, cuente la cantidad de mltiplos de 5 que contiene.Solucin:int Mul5EnCola(tCola**frente, tCola**final) {// Contar los nmeros mltiplos de 5 almacenados en la cola

    int cont=0;tCola *aux =*frente;while (*aux!= NULL) {

    int temp = Dequeue(aux, final);if(temp % 5 == 0)

    cont++;}return(cont);

    }

    Escribir una funcin que, dada una cola que almacena nmeros enteros, cuente la cantidad de mltiplos de 5 que contiene.Solucin:int Mul5EnCola(tCola**frente, tCola**final) {// Contar los nmeros mltiplos de 5 almacenados en la cola

    int cont=0;tCola *aux =*frente;while (*aux!= NULL) {

    int temp = Dequeue(aux, final);if(temp % 5 == 0)

    cont++;}return(cont);

    }

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    #include #include #include struct tColas {

    int info;struct TColas* sig;

    };

    typedef TColas tCola;

    void Enqueue(tCola **frente, tCola **final);int Dequeue (tCola **frente, tCola **final);int Multiplos5EnCola(tCola **frente, tCola **final);int EstaVacia(tCola **final, tCola **frente);

    #include #include #include struct tColas {

    int info;struct TColas* sig;

    };

    typedef TColas tCola;

    void Enqueue(tCola **frente, tCola **final);int Dequeue (tCola **frente, tCola **final);int Multiplos5EnCola(tCola **frente, tCola **final);int EstaVacia(tCola **final, tCola **frente);

    Colas Ejercicios

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    void main() {int m5, i, max;tCola *final = NULL;tCola *frente = NULL;

    // Ingresar datos a la colaprintf("Cuantos datos a ingresar? "); scanf("%d",&max);for(i=0;i < max; i++)

    Enqueue(&frente,&final);// Buscar los mltiplos de 5m5= Multiplos5EnCola(&frente, &final);printf("\n\nNumeros multiplos de 5: %d",m5);getch();

    }

    void main() {int m5, i, max;tCola *final = NULL;tCola *frente = NULL;

    // Ingresar datos a la colaprintf("Cuantos datos a ingresar? "); scanf("%d",&max);for(i=0;i < max; i++)

    Enqueue(&frente,&final);// Buscar los mltiplos de 5m5= Multiplos5EnCola(&frente, &final);printf("\n\nNumeros multiplos de 5: %d",m5);getch();

    }

    Colas Ejercicios

    Operaciones:

    A

    BA

    A B C

    B C

    B C D

    C D

    1.1.-- Insertar AInsertar A

    2.2.-- Insertar BInsertar B

    Estado de la cola:

    3.3.-- Insertar CInsertar C

    4.4.-- Remover ElementoRemover Elemento

    5.5.-- Insertar DInsertar D

    6.- Remover Elemento

    Inicio: Cola Vaca

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Tipos de colas

    Colas de prioridad Anillos BiColas BiColas circulares

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Tipos de colas: Colas de Prioridad

    Una cola de prioridad es una generalizacin de los conceptos de pila y cola en la que, tras entrar en la cola, la salida de los elementos no se basa necesariamente en el orden de llegada sino que se basa en un orden definido entre ellos.

    Los elementos se atienden en el orden indicado por una prioridad asociada a cada uno.

    Si varios elementos tienen la misma prioridad, se atendern de modo convencional segn la posicin que ocupen.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Tipos de colas: Colas de Prioridad

    Los objetos se introducen de igual forma que en los casos anteriores;

    La diferencia aparece en el caso de la extraccin y en la consulta del siguiente objeto a extraer. El elemento que se saca es el menor de los que se han

    introducido segn la relacin de orden total. Si hay varios elementos menores, con el mismo valor, el que

    se saca es aqul que se introdujo primero.

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Tipos de colas: Colas de Prioridad

    Existen dos formas de implementacin:1. Aadir un campo a cada nodo con su prioridad. Resulta

    conveniente mantener la cola ordenada por orden de prioridad.

    cp

    dato2 pr2pr1dato1 ... daton prn

    typedef struct {// Informacion// PrioridadCola *sgte;

    } Cola_Prioridad;

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Tipos de colas: Colas de Prioridad

    2. Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola.

    I11 I12 I13P1

    P2

    P3

    P4 I41 I42

    I21

    prim

    ult

    Frente Final

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Algunas aplicaciones de las colas de prioridad

    Gestin de procesos en un SO. Los procesos no se ejecutan uno tras otro en base a su orden de llegada. Algunos procesos deben tener prioridad (por su mayor importancia, por su menor duracin, etc.) sobre otros.

    Implementacin de algoritmos voraces, proporcionan soluciones globales a problemas basndose en decisiones tomadas slo con informacin local. La determinacin de la mejor opcin local suele basarse en una cola de prioridad. Algunos algoritmos sobre grafos, como la obtencin de

    caminos o rboles de expansin de costo mnimo, son ejemplos representativos.

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Convertir una expresin aritmtica infija en postfija:Dada una expresin aritmtica E formada por nmeros y los operadores: +, -, *, / expresada en formato infijo, transformarla a formato postfijo.

    Ejemplos del uso TDA Cola Prioridad

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Cola Convertir( Cola Infija ) {Cola Post; Pila P; Elem token;

    CrearPilaVacia( P );CrearColaVacia( Post );CrearElem( token );REPETIR

    Asignar(token, Frente(Infija)),SacarDeCola( Infija );Si Operando( token )

    PonerEnCola( token, Post );SinoSi (no PilaVacia(P)) && (Prioridad(token)

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Anillos Cola circular

    Las colas lineales tienen un grave problema: como las extracciones slo pueden realizarse por un

    extremo, puede llegar un momento en que el apuntador A sea igual al mximo nmero de elementos en la cola, siendo que al frente de la misma existan lugares vacos, y al insertar un nuevo elemento nos mandar un error de overflow (cola llena).

    Para solucionar el problema de desperdicio de memoria se implementaron las colas circulares, en las cuales existe un apuntador desde el ltimo elemento al primero de la cola.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Anillos Cola circular

    Es una secuencia de elementos dispuestos de forma circular. Los elementos pueden aadirse y eliminarse desde un nico

    punto llamado cabeza del anillo. El crculo de elementos se puede rotar en ambos sentidos, de

    manera que los diferentes elementos van pasando por la cabeza del anillo.

    Un anillo es, pues, una estructura en la que todo elemento tieneun sucesor y un predecesor, y hay una posicin distinguida llamada cabeza del anillo.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Anillos Cola circular

    Estructuras con caractersticas parecidas se presentan a distintos niveles: redes de computadores con configuraciones de anillo y

    comunicacin mediante paso de mensajes las interfaces de usuario, en los intrpretes de comandos,

    que suelen utilizar un buffer de entrada estructurado como un anillo de lneas que se puede recorrer para recuperar lneas introducidas con anterioridad.

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Implementacin en C Anillos

    Declaracin:struct tcola {

    int clave; struct tcola *sig;

    };

    Creacin:void crear(struct tcola **cola) {

    *cola = NULL; }

    Funcin que devuelve verdadero si la cola est vaca:int vacia(struct tcola *cola) {

    return (cola == NULL); }

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Implementacin en C Anillos

    Poner_En_Cola:void encolar(struct tcola **cola, int elem) {

    struct tcola *nuevo; nuevo = (struct tcola *) malloc(sizeof(struct tcola)); nuevo->clave = elem; if (*cola == NULL)

    nuevo->sig = nuevo; else {

    nuevo->sig = (*cola)->sig; (*cola)->sig = nuevo;

    } (*cola) = nuevo;

    }

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Implementacin en C Anillos

    Sacar_De_Cola:void desencolar(struct tcola **c1, int *elem) {

    struct tcola *aux; *elem = (*c1)->sig->clave; if ((*c1) == (*c1)->sig) {

    free(*c1); *c1 = NULL;

    } else {

    aux = (*c1)->sig; (*c1)->sig = aux->sig; free(aux);

    } }

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Implementacin en C Anillos

    Programa de prueba:#include #include int main(void) {

    struct tcola *cola; int elem; crear(&cola); if (vacia(cola))

    printf("\nCola vacia!"); encolar(&cola, 100); desencolar(&cola, &elem); return 0;

    }

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Tipos de colas BiColas

    Colas en donde los nodos se pueden insertar y eliminar por ambos extremos;

    Se les llama DEQUE (Double Ended QUEue).

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    TAD BiCola

    Las operaciones son las mismas que la del TAD Cola, salvo que Primero, Insertar y Eliminar son sustituidas por 2 operaciones respectivamente: PrimeroIzquierda: TipoDeque TipoElemento PrimeroDerecha: TipoDeque TipoElemento InsertarIzquierda: TipoElementox TipoDeque TipoDeque InsertarDerecha: TipoElemento x TipoDeque TipoDeque EliminarIzquierda: TipoDeque TipoDeque EliminarIzquierda: TipoDeque TipoDeque

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Tipos de colas BiColas

    Existen dos variantes:

    Bicolas de entrada restringida: Son aquellas donde la insercin slo se hace por el final, aunque se puede eliminar al principio o al final.

    Bicolas de salida restringida: Son aquellas donde slo se elimina por el final, aunque se puede insertar al principio y al final.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    BiColas circulares

    Permite la implementacin eficiente de todas las operaciones del anillo normal, y de la cola doble.

    p puede apuntar ahora sin problemas a la cabeza del anillo, ya que se puede acceder sin problemas y de forma directa al ltimo elemento.

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    BiColas circulares

    Las rotaciones tanto a derecha como a izquierda no suponen tampoco complicacin alguna, ya que se tienen punteros en ambas direcciones.

  • Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Bibliografa - Webgrafa

    Abstraccin de datos1. http://www14.uniovi.es/tutorED/abstraccion/abstraccionfr.html

    Estructura de Datos2. http://www14.uniovi.es/tutorED/estlineales/estlineafr.html3. http://www14.uniovi.es/tutorED/java-c++/java-c++fr.html4. Como programar en Java. Deitel y Deitel.

    Listas 5. http://www14.uniovi.es/tutorED/estlineales/interlistafr.htm

    6. http://oviedo3.ccu.uniovi.es/martin/EDI/ListPage.htm

    Universidad Tcnica Federico Santa Mara - Departamento de Informtica

    Bibliografa - Webgrafa

    Listas, pilas y colas. Ejercicios7. Fundamentos de programacin. Libro de problemas. Luis

    Joyanes Aguilar8. http://old.algoritmia.net/listas.htm9. Estructura de datos y organizacin de archivos. Mary E.

    Loomis. Prentice Hall. 2a Ed.10. Pilas y Colas. Cursos Propeduticos 2006, Programacin y

    Estructuras de Datos. Manuel Montes, Claudia Feregrino.