Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema Pilas
Tema Pilas
PILA
Una pila (stack) es una colección ordenada de
elementos a los que sólo se puede acceder por un
único lugar o extremo de la pila. Los elementos de la
pila se añaden o quitan (borran) sólo por su parte
superior (cima o tope) de la pila.
Una pila es una estructura de datos de entradas
ordenadas tales que sólo se pueden introducir y
eliminar por un extremo, llamado cima.
Notas de estructura de datos con lenguaje C
Cuando se dice que la pila está ordenada, lo que quiere decir es que
hay un elemento al que se puede acceder primero (el que está
encima de la pila), otro elemento al que se puede acceder en
segundo lugar (justo el elemento que está debajo de la cima), un
tercer elemento, etc.
No se requiere que las entradas se puedan comparar utilizando el
operador menor que (<) y pueden ser de cualquier tipo.
Una pila, torre o stack es una estructura de información en la cual los
elementos se agregan o eliminan solo por el tope.
Se dice que una estructura de esta naturaleza tiene una disciplina de
acceso, según la cual, el ultimo objeto de entrar ser precisamente
el primero en salir; esta disciplina es en ocasiones referida como
UEPS, por sus siglas.
Notas de estructura de datos con lenguaje C
Las entradas de la pila deben ser eliminadas en el orden
inverso al que se situaron en la misma.
Se tiene una pila de platos, los platos nuevos se añaden por
arriba y también se quitan de arriba, con lo que el primer
plato que se pone en la pila es el último que se quita
Otro ejemplo:
Las operaciones Insertar y Quitar(el último elemento añadido a
la pila es el primero que se quita de la pila).
Notas de estructura de datos con lenguaje C
/* archivo pilaarray.h */
#include <stdio.h>
#include <stdlib.h>
#define MaxTamaPila 100
typedef struct
typedef struct
{
TipoDato listapila [MaxTamaPila];
int cima;
}Pila;
Notas de estructura de datos con lenguaje C
/* Operaciones sobre la Pila */
void CrearPila (Pila* P);
void Insertar (Pila* P, const TipoDato elemento)
TipoDato Quitar(Pila* P);
void LimpiarPila (Pila* P);
/* Operación de acceso a Pila */
Tipodato Cima (Pila P);
/* verificación estado de la Pila */
int PilaVacia (Pila P);
int PilaLlena (Pila P);
Notas de estructura de datos con lenguaje C
EJEMPLO
Notas de estructura de datos con lenguaje C
Ejercicio de clase
Escribir un programa que use la clase Pila para
comprobar si una determinada frase/palabra
(cadena de caracteres) es un palíndromo.
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 año 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
Notas de estructura de datos con lenguaje C
COLAS
• Colas (Queue)
• La cola implementa la clásica coleccion FIFO
(primero en entrar primero en salir). Un
elemento se añade a la cola por detrás
(Enqueue) y abandona la cola por delante
(Dequeue). Al igual que en un ArrayList se
tiene un control total de donde viven los
elementos dentro de una Queue.
Las colas tienen muchas aplicaciones en los sistemas
computacionales, un ejemplo de esto es:
Para dar soporte al uso de la cola de impresión. 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 impresión 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 impresión se envíe el siguiente
trabajo a la impresora.
El servicio de atención a clientes en un supermercado.
Las aplicaciones utilizan una cola para almacenar elementos en
su orden de aparición o concurrencia.
Notas de estructura de datos con lenguaje C
Ejemplo
cola vacía
Notas de estructura de datos con lenguaje C
La variable frente o cabeza es siempre la posición del elemento que precede
al primero de la cola y avanza en el sentido de las agujas del reloj
La variable final es la posición en donde se hizo la última inserción y final se mueve
circularmente a la derecha.
Mover final adelante = (final + 1) % MaxTamQ
Mover cabeza adelante = (frente + 1) % maxTamQ
Operaciones de la cola
Una cola solo se permiten las operaciones:
Inicializar la cola
Añadir un nuevo elemento (InsertarQ)
Quitar/eliminar un elemento (EliminarQ).
El tipo Cola proporciona también frenteQ, que permite ver el
primer elemento de la cola.
Notas de estructura de datos con lenguaje C
TipoDato aux;
{
TipoDato aux;
/* si la cola está vacía, terminar el programa */
if (Qvacia (Q))
{
puts (“Elemento frente de una cola vacía”);
exit (1);
}
return (Q.listaQ[Q.frente+1]%MaxTamQ);
}
Notas de estructura de datos con lenguaje C
• Ejemplo
Funcion gato( ….)
{
….
gato(….)
….
}
Ejemplo
Para el factorial de forma recursiva.El caso base de 0! = 1
El caso base o condición de salida debe fijarse en cada solución recursiva de
un problema
El algoritmo que resuelve n! de forma recursiva se apoya en la definición:
n! = 1 si n= 0
n! = n!(n-1)! Si n> 0
long factorial(int n)
{
if(n == 0)
return 1;
else
return n*factorial(n-1);
}
Una función recursivas es una función que se
invoca así misma de forma directa o indirecta
En recursión directa el código de la función
foca() contiene una sentencia que invoca a
foca()
En recursión indirecta foca() invoca a la función
gato( ) que invoca a su vez a la función perro(),
y así sucesivamente hasta que se invoca de
nuevo a la función foca().
El requisito para que un algoritmo recursivo sea
correcto es que no genere una secuencia de
llamadas infinitas sobre si misma
La definición recursiva de f(n) debe incluir el
componente base (condición 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 función fibonacci la condición de salida o base es
f(n) = 1 para n> 1
long fibonacci(int n)
{
If(n== 0 || n == 1)
Retun n;
else
return fibonacci(n-2) + fibonacci(n-1);
}
Notas de estructura de datos con lenguaje C
Nota importante
El diseño de una función recursiva debe de
contemplar un caso base o condición de
salida, que se resuelve como una sentencia
simple, para dejar de hacer llamadas
recursivas
Notas de estructura de datos con lenguaje C
1.- Si n es 1
1.1 Mover el disco 1 a la varinicial a varifinal
2.- Si no
2.1 Mover n-1 discos de varinicial hasta varcentral
(utiliza como varilla auxiliar varfinal)
2.2 Mover el disco n desde varinicial a varfinal
2.3 Mover n-1 discos desde varcentral a varfinal
Notas de estructura de datos con lenguaje C
• Es decir si n es 1, se alcanza la condición de
salida
• Si n es mayor que 1 las etapas recursivas 2.1,
2.2, 2.3 son tres subproblemas más
pequeños, uno de los cuales es la condición
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
Notas de estructura de datos con lenguaje C