Beruflich Dokumente
Kultur Dokumente
Pilas
Se tiene una pila de platos, los platos nuevos se aaden por arriba y tambin se quitan de arriba, con lo que el primer plato que se pone en la pila es el ltimo que se quita.
1. La declaracin de una pila incluye los datos y operaciones ya citados anteriormente. 2. Datos de la pila (tipo TipoData, que es conveniente definirlo mediante typedef). 3. Verificar que la pila no est llena antes de intentar insertar o poner (<<push>>) un elemento en la pila; verificar que una pila no est vaca antes de intentar sacar (<<pop>>) un elemento de la pila. Si estas precondiciones no se cumplen se debe visualizar un mensaje de error y el programa debe terminar.
Notas de estructura de datos con lenguaje C 5. Pilavacia devuelve 1 (verdadero) si la pila est vaca y 0 (falso) en caso contrario. 6. Pilallena devuelve 1 (verdadero) si la pila est llena y 0 (falso) en caso contrario. Estas funciones se utilizan para verificar las operaciones del numeral 2. 7. LimpiarPila. Se limpia o vaca la pila, dejndola sin elementos pero no se decrementa el puntero de la pila, ya que la pila queda intacta.
Pila P; int x; CrearPila (&P); /* Crea una pila vaca */ scanf(%d, &x); Insertar (&P, x); /* inserta x en la pila P */ printf(%d \n, Cima(P)); /* visualiza el ltimo elemento*/ /* Elimina el elemento cima (x) y deja la pila vaca */ if (!PilaVacia (P)) aux = Quitar (&P); printf (%d \n, aux); LimpiaPila (&P); /* limpia la pila, queda vaca */ }
/* archivo pilaaray.c */ #include pilaarray.h /* Inicializa la pila a pila vaca */ void CrearPila (Pila* P) { P -> cima = -1; }
Las otras operaciones de la pila declaradas en el archivo pilaarray.h son: Insertar, Quitar y Cima La operacin Insertar y Quitar, insertan y eliminan un elemento de la pila la operacin Cima permite recuperar los datos de la cima de la pila sin quitar realmente el elemento de la misma.
/* poner un elemento en la pila */ void Insertar (Pila* P, const TipoDato elemento) { /* si la pila est llena, termina el programa */ if (P->Cima == MaxTamaPila -1) { puts (Desbordamiento pila); exit (1); } /* incrementa puntero cima y copiar elemento en listapila */ P->cima++; P->listapila[P->cima] = elemento; }
PILAS
EJEMPLO
/* Quitar un elemento de la pila */ Tipodato Quitar (Pila* P) { TipoDato aux; /* si la pila est vaca, termina el programa */ if (P->cima == -1) { puts (Se intenta sacar un elemento en pila vaca); exit (1); } /* guardar elemento de la cima */ aux = P->listapila [P->cima] /* decrementar cima y devolver valor del elemento */ P->cima-; return aux; }
verificacin del estado de la pila Se debe proteger la integridad de la pila, El tipo Pila ha de proporcionar operaciones que comprueben el estado de la pila: pila vaca o pila llena. Definir una operacin que restaure la condicin inicial de la pila, que fue determinada por el constructor CrearPila (cima de la pila a -1), LimpiarPila.
/* verificar pila vaca */ int PilaVacia (Pila P) { /* devuelve el valor lgico resultante de expresin cima == -1 */ return P.cima == -1; }
Ejercicio de Examen
#include <stdio.h> #include <stdlib.h> typedef struct Tigre { char *nombrep; float peso; int birth; char genero; }simba; void LeerTigre (simba *p); int EdadTigre(simba p); int Familia(simba p); int main( ) { simba mp; int puede; LeerTigre(&mp); puede=Familia(mp); if(puede == 1) printf("El tigre %s puede tener bebes\n", mp.nombrep); else printf("El tigre %s no puede tener bebes\n", mp.nombrep); }
Ejercicio de Examen
void LeerTigre (simba *p) { char nom[35]; printf("El trigre se llama:"); gets(nom); p->nombrep=(char *)malloc(sizeof(char)*strlen(nom)+1); if(p==NULL) { printf("No hay espacio en la memoria"); exit(1); } strcpy( p->nombrep,nom); printf("Su peso es:"); scanf("%f",&p->peso); printf("Su ao de nacimiento es:"); scanf("%d",&p->birth); getchar(); printf("Su genero es:, escribe F para femenino y M para masculino"); scanf("%c", &p->genero); }
Ejercicio de Examen
int EdadTigre(simba p) { int edadp; edadp=2014-p.birth; return (edadp); } int Familia(simba p) { int res,edad; edad=EdadTigre(p); if(edad>=6&&(p.genero=='f'||p.genero=='F')) res=1; else res=0; return(res); }
COLAS
Las colas tienen muchas aplicaciones en los sistemas computacionales, un ejemplo de esto es: Para dar soporte al uso de la cola de impresin. Por ejemplo, una sola impresora puede compartirse entre todos los usuarios de la red. Muchos usuarios pueden enviar trabajos a la impresora, incluso cuando esta ya se encuentra ocupada. Estos trabajos de impresin se colocan en una cola hasta que la impresora esta disponible. Un programa conocido como spooler administra la cola para asegurarse que a medida que se complete cada trabajo de impresin se enve el siguiente trabajo a la impresora. El servicio de atencin a clientes en un supermercado. Las aplicaciones utilizan una cola para almacenar elementos en su orden de aparicin o concurrencia.
En estructura de datos una cola es parecida a una pila donde los datos se almacenan de un modo lineal y el acceso a los datos slo est permitido en los extremos de la cola
Cola implementada con arreglos: la declaracin del tipo de dato Cola y los prototipos de las operaciones de la cola se almacenan en un archivo de cabecera colaarray.h #include <stdio.h> #include <stdlib.h> #define MaxTamQ 100 typedef struct { int frente; int final; TipoDato listaQ[MaxTamQ]; }Cola;
Implementacin del tipo cola La declaracin que se hizo del tipo Cola contiene un arreglo para el almacenamiento de los elementos de la cola y dos apuntadores(marcadores): uno apuntando a la posicin inicial (cabeza o cabecera) de la cola y la otra al primer espacio vaco a continuacin del final de la cola. Cuando un elemento se aade a la cola, se verifica si el marcador final apunta a una posicin vlida, a continuacin se aade el elemento a la cola y el marcador final se incrementa en 1. Cuando se quita (elimina) un elemento de la cola, se verifica si la cola est vaca, y si no es as, se recupera el elemento que se encuentra en la posicin apuntada por el marcador de cabeza y el marcador se incrementa en 1.
cola vaca
Despus de situar el elemento en la lista, el ndice final se debe actualizar para apuntar a la siguiente posicin.
/* insertar elemento en la cola */ void InsertarQ(Cola* Q, TipoDato elemento) { /* terminar si la cola est llena */ if (Qllena (*Q)) { puts (desbordamiento cola); exit (1); } /* asignar elemento a listaQ y actualizar final */ Q->final = (Q->final + 1)%MaxTamQ; Q->listaQ[Q->final] = elemento; } EliminarQ
La operacin EliminarQ elimino un elemento por el frente de la cola, una posicin que se referencia por el ndice frente e inicia el proceso de eliminacin avanzando por el frente ya que se hace referencia al anterior elemento
/* borrar elemento del frente de la cola y devuelve su valor */ TipoDato EliminarQ(Cola* Q) { TipoDato aux; /* si listaQ est vaca, terminar el progama*/ if(Qvacia(*Q)) { puts ( Eliminacin de una cola vaca); exit (1); }
La operacin Qvacia prueba si la cola no tiene elementos. int Qvacia (Cola Q) { return (Q.frente == Q.final); }
Recursividad
Se dice que un objeto es recursivo si forma parte de si mismo o se define en funcin de si mismo . La recursin aparece no solo en las matemticas, sino en la vida diaria como? La recursin es un medio muy poderosos en las definiciones matemticas En matemticas la definicin de una funcin en trminos de s misma se denomina definicin inductiva y conduce naturalmente a una implementacin recursiva Como ejemplos: la funcin factorial n! = n!(n-1)!
Ejemplo
Para el factorial de forma recursiva.El caso base de 0! = 1 El caso base o condicin de salida debe fijarse en cada solucin recursiva de un problema El algoritmo que resuelve n! de forma recursiva se apoya en la definicin:
Una funcin recursivas es una funcin que se invoca as misma de forma directa o indirecta En recursin directa el cdigo de la funcin foca() contiene una sentencia que invoca a foca() En recursin indirecta foca() invoca a la funcin gato( ) que invoca a su vez a la funcin perro(), y as sucesivamente hasta que se invoca de nuevo a la funcin foca(). El requisito para que un algoritmo recursivo sea correcto es que no genere una secuencia de llamadas infinitas sobre si misma
La definicin recursiva de f(n) debe incluir el componente base (condicin de salida) en el que f(n) se defina directamente (no recursivamente) para uno o dos valores de n. Deben existir una forma de salir de la secuencia de llamadas recursivas En la funcin fibonacci la condicin de salida o base es
Notas de estructura de datos con lenguaje C Es decir si n es 1, se alcanza la condicin de salida Si n es mayor que 1 las etapas recursivas 2.1, 2.2, 2.3 son tres subproblemas ms pequeos, uno de los cuales es la condicin de salida. En la primera etapa en el algoritmos se mueve n-1 discos desde la varilla inicial a la varilla central utilizando la varilla final como almacenamiento temporal
void hanoi( char vertnicial, char varcentral, char varfinal, int n) { If( n == 1) printf(mover disco %d desde varilla %c a varilla %c \n, n , varinicial, varfinal); else { hanio(varinicial, varfinal, varcentral, n-1) printf(mover disco %d desde varilla %c a varilla %c \n, n , varinicial, varfinal); hanio(varcentral, varinicial, varfinal, n-1) } }