Colas y Pilas
Colas y Pilas
Colas y Pilas
PILA:
Una pila (stack en inglés) es una lista ordenada o estructura de datos que permite almacenar y
recuperar datos, el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In, First Out,
«último en entrar, primero en salir») . Esta estructura se aplica en multitud de supuestos en el
área de informática debido a su simplicidad y capacidad de dar respuesta a numerosos procesos.
Para el manejo de los datos cuenta con dos operaciones básicas: apilar (push), que coloca un
objeto 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
apilado (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 anterior (apilado con
anterioridad), que pasa a ser el último, el nuevo TOS.
En un sistema operativo cada proceso tiene un espacio de memoria (pila) para almacenar valores y
llamadas a funciones.
Una pila acotada es una pila limitada a un tamaño máximo impuesto en su especificación.
Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobre una
pila de platos, y una operación retirar equivaldría a retirarlo.
A modo de resumen, la pila es un contenedor de nodos y tiene dos operaciones básicas: push (o
apilar) y pop (o desapilar). «Push» añade un nodo a la parte superior de la pila, dejando por debajo
el resto de los nodos ya presentes en la pila. «Pop» devuelve y elimina el actual nodo superior de
la pila. Una metáfora que se utiliza con frecuencia es la idea de una pila de platos dispuesta en una
cafetería en un contenedor con un muelle que mantiene la pila a nivel. En esa serie, solo el primer
plato es visible y accesible para el usuario, todos las demás permanecen ocultos. Como se añaden
nuevos platos, cada nuevo plato se convierte en la parte superior de la pila, permaneciendo
escondidos debajo los demás. A medida que el plato superior se extrae de la pila, el
inmediatamente inferior pasa a ocupar la parte superior de la pila. Dos principios importantes son
ilustrados por esta metáfora: únicamente se accede al plato que se encuentra en la parte superior
(el último en depositarse), y el resto de platos de la pila permanecen ocultos. Para extraer un plato
distinto al superior habrá que extraer antes los que se encuentran sobre él.
Operaciones
Habitualmente, junto a las dos operaciones básicas de apilar y desapilar (push, pop), la pila puede
implementar otra serie de funciones:
Una pila puede implementarse fácilmente ya sea mediante una matriz o una lista enlazada. Lo que
identifica a una estructura de datos como una pila en cualquier caso no es su estructura sino su
interfaz: al usuario solo se le permite colocar y extraer datos en el modo que se espera de una pila
y algunas otras operaciones auxiliares.
Apilar: colocar un nuevo dato en la pila. Se lee el puntero para localizar el último
elemento, se incorpora a continuación de este y se redirecciona el puntero para que
apunte al nuevo dato incorporado.
Desapilar: extraer un dato de la pila. Se localiza el último dato mediante el puntero, se lee
el dato y se redirecciona el puntero al elemento inmediato anterior para que vuelva a
apuntar al último dato de la pila.
Una pila queda definida por su origen (una dirección de memoria), y su capacidad para almacenar
datos. Cuando se intenta leer más allá de su origen (esto es, se intenta leer un elemento cuando
está vacía) o cuando se intenta sobrepasar su capacidad de almacenar elementos, se produce un
error: error por desbordamiento.
Se puede visualizar una pila de datos (independientemente de cómo se almacene en la memoria)
como una serie de datos colocados unos sobre otros (representación que se corresponde con el
mundo real) o como una sucesión de datos colocados de izquierda a derecha, unos tras otros.
Una pila ocuparía un bloque de celdas de memoria, con una dirección de origen, un espacio
reservado para la acumulación de datos y un puntero que apunta al último dato incorporado. La
estructura que adopte una pila puede ser muy variada: almacenando datos en direcciones
crecientes o decrecientes, con capacidad de almacenamiento flexible, con punteros que apunten
al último elemento o a la posición que deberá ocupar el próximo elemento que se incorpore… En
cualquier caso, quedará definida por su algoritmo: último en entrar, primero en salir.
#include <stdlib.h>
#include <stdio.h>
int valor;
} tipoNodo;
int main(){
int cant=3,num,i;
for(i=0;i<cant;i++){
scanf("%i",&num);
Push(&pila,num);
printf("\n");
for(i=0;i<cant;i++){
printf("%i, ",Pop(&pila));
system("PAUSE");
return 0;
tipoNodo *nuevo,*aux;
nuevo = malloc(sizeof(tipoNodo));
nuevo->valor = v;
nuevo->siguiente = *pila;
*pila = nuevo;
printf("\n");
tipoNodo *nodo;
nodo = *pila;
int v;
if(nodo==NULL){
return 0;
else{
*pila = nodo->siguiente;
v = nodo->valor;
free(nodo);
return v;
}
COLA:
Una cola (también llamada fila) es una estructura de datos, caracterizada por ser una secuencia de
elementos en la que la operación de inserción push se realiza por un extremo y la operación de
extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out),
debido a que el primer elemento en entrar será también el primero en salir.
En estos casos, el primer elemento de la lista realiza su función (pagar comida, pagar entrada para
el partido o para el cine) y deja la cola. Este movimiento está representado en la cola por la
función pop o desencolar. Cada vez que otro elemento se añade a la lista de espera se añaden al
final de la cola representando la función push o encolar. Hay otras funciones auxiliares para ver el
tamaño de la cola (size), para ver si está vacía en el caso de que no haya nadie esperando (empty)
o para ver el primer elemento de la cola (front).
En caso de estar vacía, borrar un elemento sería imposible hasta que no se añade un nuevo
elemento. A la hora de añadir un elemento podríamos darles una mayor importancia a unos
elementos que a otros (un cargo VIP) y para ello se crea un tipo de cola especial que es la cola de
prioridad.
Operaciones Básicas
#include <stdlib.h>
#include <stdio.h>
char dat;
}Nodo;
int main(){
int op,n;
char dato;
Nodo *frente=NULL;
Nodo *fin=NULL;
do{
scanf("%i",&op);
switch(op){
case 1:
fflush(stdin);
scanf("%c",&dato);
Nodo *nuevo;
nuevo=malloc(sizeof(Nodo));
nuevo->dat=dato;
nuevo->sig=NULL;
if(frente==NULL){
frente=nuevo;
else{
fin->sig=nuevo;
fin=nuevo;
break;
case 2:
printf("Quitando elemento....\n");
n=frente->dat;
Nodo *aux=frente;
if(frente==fin){
frente=NULL;
fin=NULL;
else{
frente=frente->sig;
aux=NULL;
break;
case 3:
aux=frente;
if(aux!=NULL){
while(aux!=NULL){
printf(" %c \n",aux->dat);
aux=aux->sig;
else{
break;
case 4:
break;
}while(op!=4);
getch();
return 0;
}
Árbol Recorridos:
PreOrden:
(Raíz, izquierda, derecha). Para recorrer un árbol binario no vacío en PreOrden, hay que realizar las
siguientes operaciones recursivamente en cada nodo, comenzando con el nodo raíz.
Orden De impresión
Visite la raíz
Atraviese el sub-árbol izquierdo
Atraviese el sub-árbol derecho
Código:
InOrden:
(Izquierda, raiz, derecho). Para recorrer un árbol binario no vacío en InOrden, hay que realizar las
siguientes operaciones recursivamente en cada nodo:
Post Orden:
(izquierdo, derecho, raíz). Para recorrer un árbol binario no vacío en PostOrden, hay que realizar
las siguientes operaciones recursivamente en cada nodo:
Codigo: