Professional Documents
Culture Documents
-DEFINICION DE PILAS: Una pila es una estructura de datos de acceso restrictivo a sus elementos. Se puede entender como una pila de libros que se amontonan de abajo hacia arriba. En principio no hay libros; despus ponemos uno, y otro encima de ste, y as sucesivamente. Posteriormente los solemos retirar empezando desde la cima de la pila de libros, es decir, desde el ltimo que pusimos, y terminaramos por retirar el primero que pusimos, posiblemente ya cubierto de polvo. Es una estructura de tipo LIFO (Last In First Out), es decir, ltimo en entrar, primero en salir. -OTRA DEFINICION: Una pila es una lista en que tanto las inserciones como las supresiones se hacen por el mismo extremo, que se conoce como el tope de la pila. EJEMPLO:
-DEFINICION DE COLAS: Una cola es una estructura de datos de acceso restrictivo a sus elementos. Un ejemplo sencillo es la cola del cine o del autobs, el primero que llegue ser el primero en entrar, y afortunadamente en un sistema informtico no se cuela nadie salvo que el programador lo diga. Es una estructura de tipo FIFO (First In First Out), es decir: primero en entrar, primero en salir.
-OTRA DEFINICION: Es una lista de proceso restringido en la cual las inserciones se hacen por un extremo llamado "ltimo" y las eliminaciones se hacen por el otro extremo llamado "delantero". Por ejemplo, los aviones que esperan despegar de un aeropuerto forman una cola, el que llega a la pista queda de ltimo y el que va a despegar est de delantero en la cola.
EJEMPLO:
-Recorrido primero en anchura de los nodos de un grafo. -Obtencin de un orden topolgico de los nodos de un grafo aciclico. B) Algunos servicios de un sistema operativo tambin se basan en el TAD cola por ejemplo: -Servicio de Impresin: Los documentos enviados a una impresora se sitan en una cola de impresin hasta que pueden ser impresos. Las peticiones de impresin se gestionan casi como una cola (orden de llegada, salvo cancelaciones.) -Planificador: Diferentes estrategias de planificacin de procesos (round robin, prioridades, etc.) emplean colas para los procesos que se van a ejecutar y determinar en que orden. -Tambin se emplean en algoritmos de simulacin para problemas de teoras de colas.
-Push en una pila vaca: Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero que apunte a l, adems el puntero a la pila valdr NULL:
El proceso es muy simple, bastar con que: 1. nodo->siguiente apunte a NULL. 2. Pilaa apunte a nodo. Push en una pila no vaca: Podemos considerar el caso anterior como un caso particular de ste, la nica diferencia es que podemos y debemos trabajar con una pila vaca como con una pila normal. De nuevo partiremos de un nodo a insertar, con un puntero que apunte a l, y de una pila, en este caso no vaca:
El proceso sigue siendo muy sencillo: 1. Hacemos que nodo->siguiente apunte a Pila. 2. Hacemos que Pila apunte a nodo.
-Pop, leer y eliminar un elemento: Ahora slo existe un caso posible, ya que slo podemos leer desde un extremo de la pila.
Partiremos de una pila con uno o ms nodos, y usaremos un puntero auxiliar, nodo:
1. Hacemos que nodo apunte al primer elemento de la pila, es decir a Pila. 2. Asignamos a Pila la direccin del segundo nodo de la pila: Pila->siguiente. 3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operacin pop equivale a leer y borrar. 4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
Si la pila slo tiene un nodo, el proceso sigue siendo vlido, ya que el valor de Pila->siguiente es NULL, y despus de eliminar el ltimo nodo la pila quedar vaca, y el valor de Pila ser NULL. -OPERACIONES DE LAS COLAS: -Operaciones bsicas con colas: De nuevo nos encontramos ante una estructura con muy pocas operaciones disponibles. Las colas slo permiten aadir y leer elementos:
Aadir: Inserta un elemento al final de la cola. Leer: Lee y elimina un elemento del principio de la cola.
- Aadir un elemento: Las operaciones con colas son muy sencillas, prcticamente no hay casos especiales, salvo que la cola est vaca.
-Aadir elemento en una cola vaca: Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero que apunte a l, adems los punteros que definen la cola, primero y ultimo que valdrn NULL:
El proceso es muy simple, bastar con que: 1. nodo->siguiente apunte a NULL. 2. Y que los punteros primero y ltimo apunten a nodo.
Aadir elemento en una cola no vaca: De nuevo partiremos de un nodo a insertar, con un puntero que apunte a l, y de una cola, en este caso, al no estar vaca, los punteros primero y ltimo no sern nulos:
El proceso sigue siendo muy sencillo: 1. Hacemos que nodo->siguiente apunte a NULL. 2. Despus que ultimo->siguiente apunte a nodo. 3. Y actualizamos ltimo, haciendo que apunte a nodo.
Aadir elemento en una cola, caso general: Para generalizar el caso anterior, slo necesitamos aadir una operacin: 1. 2. 3. 4. Hacemos que nodo->siguiente apunte a NULL. Si ultimo no es NULL, hacemos que ultimo->siguiente apunte a nodo. Y actualizamos ltimo, haciendo que apunte a nodo. Si primero es NULL, significa que la cola estaba vaca, as que haremos que primero apunte tambin a nodo.
-Leer un elemento de una cola, implica eliminarlo: Ahora tambin existen dos casos, que la cola tenga un solo elemento o que tenga ms de uno. -Leer un elemento en una cola con ms de un elemento: Usaremos un puntero a un nodo auxiliar:
1. Hacemos que nodo apunte al primer elemento de la cola, es decir a primero. 2. Asignamos a primero la direccin del segundo nodo de la pila: primero>siguiente. 3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operacin de lectura en colas implican tambin borrar. 4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
Leer un elemento en una cola con un solo elemento: Tambin necesitamos un puntero a un nodo auxiliar:
1. Hacemos que nodo apunte al primer elemento de la pila, es decir a primero. 2. Asignamos NULL a primero, que es la direccin del segundo nodo terico de la cola: primero->siguiente. 3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operacin de lectura en colas implican tambin borrar. 4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar. 5. Hacemos que ultimo apunte a NULL, ya que la lectura ha dejado la cola vaca.
Leer un elemento en una cola caso general: 1. Hacemos que nodo apunte al primer elemento de la pila, es decir a primero. 2. Asignamos a primero la direccin del segundo nodo de la pila: primero>siguiente. 3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operacin de lectura en colas implican tambin borrar. 4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar. 5. Si primero es NULL, hacemos que ultimo tambin apunte a NULL, ya que la lectura ha dejado la cola vaca.
Las pilas ofrecen dos operaciones fundamentales, que son apilar y desapilar sobre la cima. El uso que se les de a las pilas es independiente de su implementacin interna. Es decir, se hace un encapsulamiento. Por eso se considera a la pila como un tipo abstracto de datos. -IMPORTANCIA DE LAS COLAS: Las colas sern de ayuda fundamental para ciertos recorridos de rboles y grafos. Las colas ofrecen dos operaciones fundamentales, que son encolar (al final de la cola) y desencolar (del comienzo de la cola). Al igual que con las pilas, la implementacin de las colas suele encapsularse, es decir, basta con conocer las operaciones de manipulacin de la cola para poder usarla, olvidando su implementacin interna.
Figura 4.7 Saturacin en la pila J. Se encontr espacio en la pila K. En este caso J > K. Algoritmo de desplazamiento. Este algoritmo busca una posicin disponible, a partir de la primera pila, en cual de ellas hay nodo vaco. En caso de encontrar espacio antes de la pila IP (IP > K), llama a la rutina ATRAS; si, por el contrario, el espacio se encuentra delante de la pila IP (IP < K), se llama a la rutina ADELANTE. K es la variable que denota la pila donde hay espacio.
Precondicin: 1 IP NP Poscondicin: I es VERDADERO, si se puede asignar una posicin a la pila IP, para hacer la insercin. I es FALSO, toda el rea esta ocupada, hay condicin de saturacin. SATURACION(IP,I) Comience K <= 1 SW<= 0 Mientras ((NP > K),^,(SW=0)) Ejecute Si (TOPE[K] < BASE[K+1]) Entonces Si (K > IP) Entonces Llame ADELANTE(IP,K) Sino Llame ATRAS(IP,K) Fin-Si SW <= 1 Sino K <= K+1 Fin-Si Fin-Mientras Si (SW=0) Entonces I <= F Sino I <= V Fin-Si Termine
Figura 4.8 Cuando IP < K, los datos se mueven hacia adelante comenzando con el nodo de direccin ms alta LS, hasta el de ms baja LI.
Precondicin: IP < K Poscondicin: Se han movido todos los datos, entre las pilas K y IP+1, para dejar una posicin adicional, a la pila IP. RUTINA ADELANTE(IP,K) Comience LS <= TOPE[K] LI <= BASE[IP+1] +1 L <= LS Mientras (L LI) Ejecute PILA[L+1] <= PILA[L] L <= L - 1 Fin-Mientras J <= IP +1 Mientras (J K) Ejecute BASE[J] <= BASE[J] + 1 TOPE[J] <= TOPE[J] +1 J <= J+1 Fin-Mientras Retorne
Figura 4.9 Se mueven los datos hacia atrs comenzando con LI hasta LS. RUTINA ATRAS (J, K)
Precondicin: K<IP NP Poscondicin: Se han movido todos los datos, entre las pilas K +1 e IP, para dejar una posicin adicional, a la pila IP. Comience LI <= TOPE[IP] LS <= BASE[K+1] L <= LS Mientras (L LI) Ejecute PILA[L-1] <= PILA[L] L <= L + 1 Fin-Mientras J <= K+1 Mientras (J IP) Ejecute BASE[J] <= BASE[J] - 1 TOPE[J] <= TOPE[J] -1 J <= J+1 Fin-Mientras Retorne
La desventaja del desplazamiento para el manejo de la condicin de saturacin, es que solo provee un nodo para la pila donde se present dicha condicin. Es posible que se presenten saturaciones sucesivas sobre la misma pila, deteriorando la eficiencia del sistema. Reempaque. Cada que ocurre una saturacin se hace un reempaque del rea de memoria. Se basa en un cambio de tamao de cada pila desde el ltimo reempaque. El algoritmo utiliza un arreglo llamado TOPEAN (I), con 1 I N, que guarda la distribucin inicial de los topes. Tambin utiliza los vectores D, y NBASE ambos con dimensin NP. El vector D lleva el crecimiento de cada pila desde el ltimo reempaque, y NBASE, nueva base, es el vector que lleva las nuevas posiciones de la base despus del reempaque.
Precondicin: 1 IP NP Poscondicin: I es VERDADERO, si se puede asignar una posicin a la pila IP, para hacer la insercin. I es FALSO, toda el rea esta ocupada, hay condicin de saturacin. GUARDATOPES Comience K <= 1 Mientras (K NP) Ejecute TOPEAN[K] <= TOPE[K] K <= K+1 Fin-Mientras Termine SATURACION (IP,I) -ALGORITMO G Inicialmente detecta el incremento total de las pilas que crecieron y el crecimiento de cada pila. Luego, con base en la variable real P (0 P 1), se calculan los factores ALFA y BETA, con los cuales se asignan nuevas bases. Con la rutina REEMPAQUE se efecta el movimiento de datos.
Comience SUM <= M INC <= 0 K <= 1 Mientras (K NP) Ejecute SUM <= SUM - (TOPE[K] -BASE[K]) Si (TOPE[K] > TOPEAN[K]) Entonces D[K] <= TOPE[K] -TOPEAN[K] INC <= INC + D[K] Sino D[K] <= 0 Fin-Si K <= K+1 Fin-Mientras Si (SUM > 0) Entonces ALFA <= (P/NP) * SUM BETA <= ((1-P)/INC) * SUM K <= 2 NBASE[1] <= BASE[1] Mientras (K N) Ejecute NBASE[K] <= NBASE([K-1] + (TOPE[K-1] - BASE([K-1])+ ALFA + (BETA * D[K-1]) K <= K+1 Fin-Mientras REEMPAQUE I <= V Sino I <= F Fin-Si Retorne
ALFA es un valor entero correspondiente al truncamiento de la fraccin, es el nmero de posiciones que le corresponde a cada una de las pilas. BETA es el factor por el cual se hace el repartimiento de acuerdo al crecimiento, anterior a la condicin de saturacin, de cada pila. Quiz la parte ms interesante de este algoritmo es el proceso general de reempaque. El reempaque no es trivial puesto que ciertas partes del contenido de la memoria se desplazan hacia adelante y otras hacia atrs; es importante tener cuidado para no regrabar ninguna posicin de memoria que contenga datos mientras se est realizando una operacin de movimiento.
ALGORITMO R Comience K <= 2 Mientras (K NP) Ejecute Si ( NBASE[K] < BASE([K] ) Entonces ATRAS(K) Sino Si ( NBASE[K] > BASE([K] ) Entonces ADELANTE(K) Sino TOPEAN[K] <= TOPE[K] Fin-Si Fin-Si K <= K+1 Fin-Mientras Retorne
ALGORITMO ATRAS Comience LI <= BASE[K] + 1 LS <= TOPE[K] CAMBIO <= (BASE[K]-NBASE[K]) Mientras (LI LS) Ejecute PILA[LI-CAMBIO] <= PILA[LI] L <= L + 1 Fin-Mientras BASE[K] <= NBASE[K] TOPE[K] <= TOPE[K] - CAMBIO TOPEAN[K] <= TOPE[K] Retorne Es un poco ms difcil cuando la nueva base es mayor que la anterior.
Figura 4.10 Movimiento de datos hacia adelante. Primero se deben hacer los movimientos de ms adelante, para no daar la informacin En el caso de la figura 4.10, se observa que no se pueden mover los datos de la pila 3. Es decir, se debe continuar buscando una condicin en NBj Bj; de todas maneras siempre se cumple que NB(NP+1)=B(NP+1). Recordemos que para los diferentes procesos se cre la pila ficticia NP+1.
ALGORITMO ADELANTE Comience J <= K Mientras (BASE[J] < NBASE[J]) Ejecute J <= J +1 Fin-Mientras KN <= J -1 Mientras (KN K) Ejecute LI <= BASE[KN] + 1 LS <= TOPE[KN] CAMBIO <= NBASE[KN] - BASE[KN] Mientras (LS LI) Ejecute PILA[LS+CAMBIO] <= PILA[LS] LS <= LS + 1 Fin-Mientras BASE[KN] <= NBASE[KN] TOPE[KN] <= TOPE[KN] +CAMBIO TOPEAN[KN] <= TOPE[KN] KN <= KN -1 Fin-Mientras Retorne
Figura 4.15 (a) Condicin inicial crtica (b) Condicin final una vez se ha eliminado el nodo delantero
ALGORITMO ELIM-COLA-CIR(DATO,I) Precondicin: Que haya cola. Poscondicin: U apunta al ltimo elemento de la cola, si hay elementos, sino, queda la cola en condicin de cola vaca. Comience I <= V PRUEBA-COLA(VACIA) Si (VACIA) Entonces I <= F Sino DATO <= COLA[D] Si (D=U) Entonces D <= 0 U <= D Sino D <= D + C Si (D = M) Entonces D <= 1 Sino Fin-Si Fin-Si Fin-Si Termine
-su ventaja mas importante reside en que no se necesita utilizar registros o variables temporales para los valores intermedios en las expresiones. La pila acta como gestor y almacn de esos valores. -La estructura del cdigo permite que la traduccin a cdigo de pila sea prcticamente directa.
-EJEMPLOS DE COLAS: EJEMPLO: #include <stdio.h> #define MAX_COLA 50 /* cola de 49 elementos */ Int main (void) { Struct tcola cola; Int elem; Crear (&cola); If (vaca (&cola)) printf ("\nCola vaca."); If (llena (&cola)) printf ("\nCola llena."); Encolar (&cola, 1); Desencolar (&cola, &elem); Return 0; }
Ejemplo: Void Funcin (void); Si queremos enviarle un entero y que devuelva un entero: Int funcin (int a); As el entero que le enviemos, se llamara a en la funcin y si esta funcin devuelve un entero, al llamarla llevara a la izquierda un igual y la variable que este a la izquierda guardara el valor devuelto. Se puede usar todo tipo de datos para enviar/recibir a/de las funciones Esa es la declaracin de funciones. Luego habrn de ser colocadas como se coloca el Main (sea con sus corchetes y escribiendo dentro el cdigo que realicen) Os quiero apuntar, que la orden para devolver valores es return. Return variable; En el main, el return, se utiliza mas que nada para saber si el programa Se ejecuto correctamente. Generalmente, un programador hace que devuelva 0 si su programa se ejecuto correctamente y otro numero si tuvo algn problema (el nmero ser identificativo del problema) Ejemplo: Return 0; Devolvera 0 en una funcin. Cdigo fuente con el ejemplo del uso de una funcin. #include <stdio.h> Int suma (int a,int b); Void main ()
Int sumando1,sumando2,resultado; Printf ("Mete el primer sumando:\n"); Scanf ("%d", &sumando1); Printf ("\nMete el segundo sumando:\n"); Scanf ("%d", &sumando2); Fflush (stdin); //borra el buffer del teclado ;) Resultado=suma (sumando1, sumando2); Printf ("\nEl resultado fue: %d", resultado); Getchar ();
} int suma (int a, int b) { Int c; c = a + b; Return c; } Como dato curioso, para enviar parmetros desde el sistema operativo (Ejemplo, cuando pones ping 127.0.0.1, la IP, es un parmetro) Debemos declarar el main de la siguiente forma: Int main (int argc, char * argv []) Argc ser el nmero total de argumentos. Argv [0] ser el nombre del exe Argv [1] el primer parmetro ect..
INTRODUCCION:
El lenguaje C naci en los Laboratorios Bell de AT&T y ha sido estrechamente asociado con el sistema operativo UNIX, ya que su desarrollo se realiz en este sistema y debido a que tanto UNIX como el propio compilador C y la casi totalidad de los programas y herramientas de UNIX, fueron escritos en C. Su eficiencia y claridad han hecho que el lenguaje ensamblador apenas haya sido utilizado en UNIX. En 1972, Dennis Ritchie, toma el relevo y modifica el lenguaje B, creando el lenguaje C y reescribiendo el UNIX en dicho lenguaje. La novedad que proporcion el lenguaje C sobre el B fue el diseo de tipos y estructuras de datos. Los tipos bsicos de datos eran "CHAR" (carcter), "INT" (enteros), "FLOAT" (Reales en simple presicin), y "DOUBLE" (Reales en doble Presicin). Posteriormente se aadieron los tipos "SHORT" (Enteros de longitud<=longitud de un int), "LONG" (Enteros de longitud >= longitud de un entero), "UNSIGNED" (Enteros sin signo), y "ENUMERACIONES". Los tipos estructurados bsicos de C son las estructuras, las uniones, y los arrays. Estos permiten la definicin y declaracin de tipos de mayor complejidad. Las instrucciones de control de flujo de C son las habituales de la programacin estructurada: IF, FOR, WHILE, SWITCH - CASE, todas incluidas en su predecesorBCPL. C incluye tambin punteros y funciones. Los argumentos de las funciones se pasan por valor, esto es copiando su valor, lo cual hace que no se modifiquen los valores de los argumentos en la llamada. Cuando se desea modificar los argumentos en la llamada, stos se pasan por referencia, es decir, se pasan las direcciones de los argumentos. Por otra parte, cualquier funcin puede ser llamada recursivamente. Este trabajo se centra particularmente en las funciones, pilas y colas todas estas estructuras del lenguaje. Las pilas son una estructura lineal donde las adiciones y eliminaciones se hacen por un extremo Tambin se la conoce con el nombre de estructura LIFO ---->Last Input Output (ultimo en entrar primero en salir), las operaciones bsicas que se pueden realizar con las pilas son: creacin, adicin, eliminacin y listado. Las colas son una estructura de datos que consiste en realizar las inserciones por extremo y las eliminaciones por otro. Las colas tambin se llaman FIFO (primero entrar, primero en salir).
CONCLUSION:
Finalmente, C, que ha sido pensado para ser altamente transportable y para programar lo improgramable, igual que otros lenguajes tiene sus inconvenientes. Carece de instrucciones de entrada/salida, de instrucciones para manejo de cadenas de caracteres, con lo que este trabajo queda para la librera de rutinas, con la consiguiente prdida de transportabilidad. La excesiva libertad en la escritura de los programas puede llevar a errores en la programacin que, por ser correctos sintcticamente no se detectan a simple vista. Por otra parte las precedencias de los operadores convierten a veces las expresiones en pequeos rompecabezas. A pesar de todo, C ha demostrado ser un lenguaje extremadamente eficaz y expresivo. En cierto modo y en la bsqueda de la verdad, de la lgica y de la razn hemos analizado profundamente los aspectos tcnicos acerca de las diferentes estructuras dinmicas y no dinmicas que se encuentran en el lenguaje, centrndonos especialmente y con particular nfasis en las funciones todas ellas muy importantes para la programacin estructurada, las colas ,las pilas herramientas indispensables para el ahorro del tiempo a nosotros los programadores solo la tecnologa futura y los nuevos avances tecnolgicos nos darn la luz y nos ensearan el camino por el cual debe pasar la humanidad llevada de la mano por la informatica.
BIBLIOGRAFIA:
Estructuras dinmicas de datos. Algoritmos, acceso, propiedades, ejemplos. Direccin Pgina Web: http://c.conclase.net/edd/index.php?cap=000 INSTITUTO TECNOLOGICO de La Paz. Tutorial de Estructura de Datos. Direccin Pgina Web: http://www.itlp.edu.mx/publica/tutoriales/estru1/ ALGORITMIA ALGO+ - Algoritmos y Estructuras de Datos. Direccin Pgina Web: http://www.algoritmia.net/articles.php?id=13 100cia.com > Portada > Enciclopedia > Estructura_de_datos. Direccin Pgina Web: http://www.100cia.com/enciclopedia/Estructura_de_datos El Rincn del Programador. Programacin Genrica. Estructura de Datos. Listas. Direccin Pgina Web: http://rinconprog.metropoliglobal.com/CursosProg/ProgGen/Estr_Datos/index.php? cap=4