jueves, 20 de noviembre de 2014

Estructuras dinámicas de memoria mediante: pilas, colas y listas.





Arreglo


Estructura de datos



Una pila (stack en inglés) es una estructura de datos de tipo LIFO (del inglés Last In First Out,último en entrar, primero en salir) que permite almacenar y recuperar datos. Se aplica en multitud deocasiones en informática debido a su simplicidad y ordenación implícita en la propia estructura.Representación gráfica de una pilaPara el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que coloca unobjeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado.En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último objeto apliado(denominado TOS, top of stack en inglés). La operación retirar permite la obtención de este elemento,que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser elnuevo TOS.Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobreuna pila de platos, y una operación retirar a retirarlo.Las pilas suelen emplearse en los siguientes contextos:Evaluación de expresiones en notación postfija (notación polaca inversa).Reconocedores sintácticos de lenguajes independientes del contextoImplementación de recursividad.EjemploForma principal.

Apuntador: definición, declaración y ejemplo en C.


Recursividad

La recursividad es una técnica de programación importante. Se utiliza para realizar una llamada a una función desde la misma función. Como ejemplo útil se puede presentar el cálculo de números factoriales. Él factorial de 0 es, por definición, 1. Los factoriales de números mayores se calculan mediante la multiplicación de 1 * 2 * ..., incrementando el número de 1 en 1 hasta llegar al número para el que se está calculando el factorial.

If (n < = 1)
return (n);
lofib = 0 ;
hifib = 1 ;
for (i = 2; i < = n; i ++)
{
x = lofib ;
lofib = hifib ;
hifib = x + lofib ;
} /* fin del for*/
return (hifib) ;


Leer más: http://www.monografias.com/trabajos14/recursividad/recursividad.shtml#ixzz3JeXBDVzI

Parámetros por valor y por referencia

Parámetros por referencia a funciones

En C todos los parámetros se pasan por valor. Esto tiene en principio dos inconvenientes:
•          No se pueden modificar variables pasadas como argumentos
•          Si se pasa como parámetro una estructura, se realiza un duplicado de ella, con lo que se pierde tiempo y memoria

Sin embargo, se puede pasar un puntero como argumento a una función. El puntero no se puede alterar, pero sí el valor al que apunta:

void incrementa_variable (int* var)
{
   (*var)++;
}

main()
{
   int x = 1;
   incrementa_variable (&x);       /* x pasa a valer 2 */
}


En el ejemplo anterior, habia que poner paréntesis en (*var)++ porque el operador ++ tiene más precedencia que la desreferencia (el asterisco). Entonces *var++ sería como escribir*(var++), que no sería lo que queremos.

En el pasaje por referencia se pasa a la función las direcciones de memoria de las variables en cuestión en lugar de su valor. A diferencia del paso por valor, aquí no se realizan copias de las variables sino que se trabaja sobre la dirección de memoria que pasamos, lo que nos permite modificar el valor de la variable en cuestión.


Veamos esto con el mismo ejemplo que usamos antes, pero usando punteros:




Luego hacemos el llamado a la función de la misma manera, pero pasando las direcciones de memoria de x e y:



Obteniendo lo siguiente al compilar el programa y ejecutarlo:



Donde vemos que esta vez sí se modificó el contenido de las variables en cuestión.