Practica06 Pilas y Colas

download Practica06 Pilas y Colas

of 23

Transcript of Practica06 Pilas y Colas

  • Tabla de Contenidos

    !

    " #

    #

    $ %

    &

  • ndice de Listados $'!&

    $('!!(

    $'!) (

    $' !*

    $"' !!*

    $&'!+

    $*'!(

  • 1. Introduccin

    ! "#$

    %#

    & % ! $ " '$

    (

    # & )*

    !"#

    # &%+!

    ,--. "#

    -%

    ! " % -

    #

    &$-$

    #

    2. Pilas *)

    +%#&/0!/-0"#1

    2

    2#

    , 3!*

    " %!/0"#& 3

    %#

    2.1 Funciones asociadas a las pilas %,

    #&%(

    push(/%+#

    pop( 4 * %+ #

    *

    - - -

    $#5

    ,#& % %push$pop-$#

  • 1%push62*!',"#1*%pop 62 ! * *"# 7

    %,(

    push(A) A push(B) AB pop() A B push(C) AC push(D) ACD pop() AC D pop() A C pop() A

    2.2 Soporte para la implementacin de una pila 1$ ' - %-

    $%#

    3$3#

    2.2.1 Uso de listas

    1 3 3 -

    %!push",3(

    1#

    /#

    %*!pop",3(

  • 8

    &*#

    9#

    2.2.2 Uso de tablas

    1 3 , -

    ' ,(3

    +#

    &+3(

    - base- 3 3 # & +% #

    7+, cima ,#&+%#

    :+,#

    %+,3%pop$push%(

    &

    / push(A) push(B) pop()

    9

    , ; ; ;

    ;,+%-$

    %, 3 , *- dimension#,

    (base + dimension) == cima &-,=3

    LIFO!/0"--'$

  • 2.4 Ejercicio con tablas 53!4:"

    % #,--

    $!+---*$/"$ #&4:-?*%

    (7 - 3) * (2 + 1)

    4:(

    7 3 2 1 + *

    ' 3=#

    ,#

    &-$3%(

    ,$'

    @fA ,-$ 3 #

    1#

    1-*!

    ,"-$#

    , MAXELE ! 10" , pila# 5 3 !0,"#,int$+, *#&+

  • ;3%coge_op-=+(

    7

  • % push , %# &%0'3-$1#>,#

    %pop*#&%%-0 ' 3- $1 # > *,

  • C

    Listado 2: Fichero pila.h #ifndef PILA_H #define PILA_H

    int push(int i); int pop(int *f);

    #endif

    Listado 3: Fichero makefile # # Macros #

    COMPILADOR = gcc OBJETO = pila.o cogeOp.o calc.o CABECERA = pila.h cogeOp.h OPCIONES = -Wall -c EJECUTABLE = calculadora

    # # Construccion del ejecutable #

    $(EJECUTABLE): $(OBJETO) $(CABECERA) $(COMPILADOR) -o $(EJECUTABLE) $(OBJETO) pila.o: pila.c $(CABECERA) $(COMPILADOR) $(OPCIONES) pila.c cogeOp.o: cogeOp.c $(CABECERA) $(COMPILADOR) $(OPCIONES) cogeOp.c calc.o: calc.c $(CABECERA) $(COMPILADOR) $(OPCIONES) calc.c

  • D

    Listado 4: fichero cogeOp.c #include #include /*para usar isspace e isdigit*/ #include cogeOp.h

    int coge_op(int *pnum) { /*Funcion que lee un elemento de la entrada*/ int c; int num;

    do { c = getchar(); }while (isspace(c) && c!= '\n');

    if (isdigit(c)) { num = 0;

    do{ num = num *10 + c - '0'; c = getchar(); } while(isdigit(c));

    *pnum = num;

    if (c!=f) ungetc(c,stdin); c = '0'; }

    return c; }

    Listado 5: fichero cogeOp.h #ifndef COGEOP_H #define COGEOP_H

    int coge_op(int *pnum);

    #endif

  • E

    Listado 6: Fichero calc.c #include #include "pila.h" /*para usar push y pop */ #include "cogeOp.h"

    int main() { int op1; int op2; int tipo; /*Clase de operador u operando*/ int numero; /*Valor del operando */

    while (f != (tipo = coge_op(&numero))) { switch(tipo) { case '0': if (push(numero)) printf("pila llena\n"); break; case '+': if (pop(&op1) || pop(&op2)) printf("No hay suficientes operandos\n"); else push(op2 + op1); break; case '-': if (pop(&op1) || pop(&op2)) printf("No hay suficientes operandos\n"); else push(op2 - op1); break; case '*':

    if (pop(&op1) || pop(&op2)) printf("No hay suficientes operandos\n"); else push(op2 * op1); break; case '/': if (pop(&op1) || pop(&op2)) printf("No hay suficientes operandos\n"); else if (op1 == 0) printf("Error: division por cero\n"); else push(op2 / op1); break; case '\n': if (pop(&op1)) printf("Pila vacia\n"); else { printf("Resultado: %d\n", op1); push(op1); } break; default: printf("Error: token %c no reconocido\n", tipo); break; } } return 0; }

  • 2.5 Ejercicio con listas 4 3 3 ,#

    ,p06/pilaConListas$=%'calc.c-pila.h-cogeOp.c$cogeOp.h #1 ,= %'!listas.h-listas.c-###"#

    F%%'%'pila.c3#

    F%,=%'makefile ,#

    3. Colas /0!/-0"#1

    -6

    2#

    +% - -(

    -$*#&1-

    3%#

    3.1 Funciones asociadas a las colas

    % ,

    #&%(

    alm(#

    rec(*#&-%

    -=#

    &%%alm$rec(

  • 1%alm62*#1*%rec

    !GG"#, %alm$rec(

    alm(A) A alm(B) AB rec() B A alm(C) BC alm(D) BCD rec() CD B rec() D C rec() D

    3.2 Soporte para la implementacin de las colas ; -

    %- $ %

    #H-,$

    3#

    3.2.1 Listas enlazadas.

    1 3 3 -

    %!alm",3(

    1#

  • /

  • 8

    1,-+(

    apos == rpos

    & % % - , apos %,#;-,+-

  • $'$,#&-apos'

  • ,=(

    apos == rpos

    $+#&,

    %-3

    ( '$( '$

    aposrpos?-apos$' ,-rpos+#/#1apos,-?rpos,-(

    apos(

    apos = (apos + 1) % dimension; if (0 == apos) // Hemos dado la vuelta indicador = 1;

    rpos(

    rpos = (rpos + 1) % dimension; if (0 == rpos) // Hemos dado la vuelta indicador = 0;

    &-,+rpos3apos(

    (rpos == apos) && (indicador == 0) $apos3rpos(

    alm(E)(

    alm(G)(

    apos

    rpos apos

    rpos

    rpos

    apos

    rpos

    apos

    Sit. inicial:

    alm(F)(

    apos

    rpos rpos

    apos

    rpos apos

    apos

    rpos

  • (rpos == apos) && (indicador == 1)

    3.3 Ejercicio 1p06/colas#1' %' gcolas.c- , p06/colas #

    1%'colas.c-colas.h$makefile ,'#7,#

  • C

    Listado 7: Fichero gcolas.c /* fichero: gcolas.c utiliza: colas.h colas.c

    comentarios: demo de trabajo con colas

    */

    #include #include

    #include "colas.h"

    int main() { int i; /* auxiliar: seleccion menu*/ int dato;

    do { printf("\nGESTION DE COLAS BASICA"); printf("\n========================"); printf("\nElija opcion:\n"); printf("\t 0: Salir\n"); printf("\t 1: Insertar un elemento\n"); printf("\t 2: Recuperar un elemento\n"); printf("\n \t\t Opcion: ");

    scanf("%d", &i);

    switch (i) { case 0: break; case 1: printf(Valor a insertar: ); scanf(%d, &valor); if (0 != alm(valor)) printf(La cola est llena\n); break; case 2: if (0 == rec(&valor)) printf(El valor recuperado es %d\n, valor); else printf(La cola est vaca\n); break; } } while (0 != i);

    return 0; }