Pilas
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Definición
• Es un tipo especial de lista abierta en la que sólo
se pueden insertar y eliminar nodos en uno de
los extremos de la lista.
Elemento 6
Elemento 5
Elemento 4
Pila
Elemento 3
Elemento 2
Elemento 1
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Características
• Las operaciones se conocen como "push" y
"pop", respectivamente "empujar" y "tirar".
• Además, las escrituras de datos siempre son
inserciones de nodos, y las lecturas siempre
eliminan el nodo leído.
• Estas características implican un
comportamiento de lista LIFO (Last In First
Out), el último en entrar es el primero en salir.
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
• Misma forma del nodo que en las listas:
class nodo {
public:
int dato;
nodo *siguiente;
};
Pila DATO DATO DATO DATO NULL
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Operaciones básicas
• Añadir un elemento al final de la pila. (PUSH)
• Leer y eliminar un elemento del final de la pila.
(POP)
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Insertar un elemento
• Insertar un elemento en una pila vacía
Pila NULL
Nodo DATO
2 1
Pila DATO NULL
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
• Insertar un elemento en una pila no vacía
edu.mx
Pila DATO DATO ……
Nodo DATO
Pila DATO DATO ……
2 1
Nodo DATO
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Leer y eliminar un elemento
• Eliminar el primer nodo de una pila
Pila DATO DATO ……
Nodo
4 2
Pila DATO DATO ……
1
3
Nodo
DATO
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Ejemplo 1
• Supongamos que queremos construir una pila
para almacenar números enteros. Haremos
pruebas intercalando varios "push" y "pop", y
comprobando el resultado.
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
#include<stdlib.h> Los tipos que definiremos normalmente
#include <stdio.h> para manejar pilas serán casi los mismos
que para manejar listas, tan sólo
cambiaremos algunos nombres.
typedef struct nodo {
int valor; • tipoNodo: tipo para declarar nodos.
struct nodo *siguiente;
} tipoNodo; • pNodo: tipo para declarar punteros a nodo
typedef tipoNodo *pNodo; • Pila es el tipo para declarar pilas.
typedef tipoNodo *Pila;
Declaramos las funciones que tendrá la pila:
void Push(Pila *l, int v); • Push: agregar un entero a la pila
int Pop(Pila *l);
• Pop: eliminar el último nodo y retornar su
valor.
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
int main() {
Pila pila = NULL; Declaramos un puntero de tipo Pila
Push(&pila, 20); Agregamos el valor 20 y el valor 10 a la pila.
Push(&pila, 10); Después mostramos el último entero en la
printf("%d, ", Pop(&pila)); pila, en este caso, se muestra el 10.
Push(&pila, 40); Ahora, agregamos el valor 40 y el valor 30.
Push(&pila, 30); Después mostramos los últimos dos valores,
printf("%d, ", Pop(&pila)); para nuestro caso, serán los valores que
printf("%d, ", Pop(&pila)); acabamos de agregar.
Push(&pila, 90); Añadimos el valor 90 a la pila.
printf("%d, ", Pop(&pila));
Mostramos los últimos dos valores
printf("%d\n", Pop(&pila));
insertados en la pila.
getchar();
return 0;
} RESULTADO: 10, 30, 40, 90, 20
Dr. Alejandro Villarreal -
void Push(Pila *pila, int v) { juan.villarrealmjc@uanl.
edu.mx
pNodo nuevo;
nuevo = (pNodo)malloc(sizeof(tipoNodo)); Crea un nodo nuevo.
nuevo->valor = v;
nuevo->siguiente = *pila; Añadimos la pila a continuación del nuevo nodo.
*pila = nuevo; Ahora, el comienzo de nuestra pila es en nuevo nodo.
}
int Pop(Pila *pila) {
pNodo nodo; Variable auxiliar para manipular nodo.
int v; variable auxiliar para retorno.
nodo = *pila; Nodo apunta al primer elemento de la pila.
if(!nodo) return 0; Si no hay nodos en la pila retornamos 0.
*pila = nodo->siguiente; Asignamos a pila toda la pila menos el primer
v = nodo->valor; elemento. Guardamos el valor de retorno.
free(nodo); Borramos el nodo y regresamos el valor que este
return v; contenia.
}
Prueba Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
int main() {
Pila Pila Pila Pila Pila Pila
Pila pila = NULL;
Push(&pila, 20); 90 30 40 10 20 NULL
Push(&pila, 10);
printf("%d, ", Pop(&pila));
Nodo Nodo Nodo Nodo Nodo
Push(&pila, 40);
Resultado = 10 30 40 90 20
Push(&pila, 30);
printf("%d, ", Pop(&pila));
printf("%d, ", Pop(&pila));
Push(&pila, 90);
printf("%d, ", Pop(&pila));
printf("%d\n", Pop(&pila)); Pila
getchar(); 30
return 0; 90
40
10
} 20
Colas
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Definición
• Una cola es un tipo especial de lista abierta en la
que sólo se pueden insertar nodos en uno de los
extremos de la lista y sólo se pueden eliminar
nodos en el otro.
• Además, como sucede con las pilas, las
escrituras de datos siempre son inserciones de
nodos, y las lecturas siempre eliminan el nodo
leído.
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
• Este tipo de lista es conocido como lista FIFO
(First In First Out), el primero en entrar es el
primero en salir.
• Forma típica del nodo:
class nodo {
public:
int dato;
nodo *siguiente;
};
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
• La representación interna es la siguiente
DATO DATO DATO DATO NULL
primero
ultimo
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Operaciones básicas
• Insertar un elemento al final de la cola.
• Leer y eliminar un elemento del principio de la
cola.
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Insertar un elemento
• Insertar un elemento en una cola vacía
primero NULL nuevo DATO
ultimo NULL
ultimo 3
2 1
primero DATO NULL
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
• Insertar un elemento en una cola no vacía
edu.mx
DATO DATO DATO DATO NULL
primero
ultimo
ultimo
DATO DATO DATO DATO NULL
primero
2
1
nuevo DATO NULL
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Leer y eliminar un elemento
• Eliminar un elemento en una cola con más de un
elemento
ultimo
DATO DATO DATO DATO NULL
primero
3 DATO
aux 1 ultimo
DATO DATO DATO DATO NULL
primero 2
4
primero
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
• Leer un elemento en una cola con un solo
edu.mx
elemento
ultimo
primero DATO NULL
1 aux 3 DATO
ultimo
primero DATO NULL
4
2 primero NULL
5 ultimo NULL
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Ejemplo 2
• Crear un programa en el que se capture una
expresión matemática por el método postfijo,
evaluar la expresión y mostrar el resultado.
• La información sobre lo definición de notación postfija y el algoritmo de
conversión desde una formula infija, la pueden encontrar en la presentación
llamada “Algoritmos Postfijo y Prefijo”
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Ejemplo 3:
• Desarrollar un programa que implemente las
funciones agregar y leer para una estructura de
datos del tipo COLA. Probar su funcionamiento.
• Desarrollar el mismo ejemplo, pero con un
arreglo.
Dr. Alejandro Villarreal -
juan.villarrealmjc@uanl.
edu.mx
Ejemplo 4:
• Desarrollar un programa que solicite datos al
usuario y los vaya almacenando en una COLA.
Cuando el usuario termine de capturar, el
programa debe de mostrar los valores en el
orden en que fueron ingresados y en orden
inverso utilizando una PILA.