Está en la página 1de 31

Pilas y Colas

Rodrigo Amo Sanz


Sandra Martín Fernández

Ampliación de informática
Índice
 TDA Pila
 Definición y operaciones básicas
 Operaciones e implementación
 Aplicaciones

 TDA Cola
 Definición y operaciones básicas
 Operaciones e implementación
 Aplicaciones
TDA PILA
Definición

Def: una pila es una lista ordenada de elementos en la que todas las
inserciones y supresiones se realizan por un mismo extremo
denominado tope o cima de la pila.

Estructura LIFO (Last In First Out): “último en entrar primero


en salir”
TDA PILA

Operaciones básicas

 PUSH: apilar, meter

 POP: desapilar, sacar

 TOP: cima, tope


TDA PILA

Operaciones
 Crear_pila(P: pila, ok: lógico)
 Borrar_pila(P: pila, ok: lógico)
 Vacía?(P: pila, resp: lógico)
 Llena?(P: pila, resp: lógico)
 Push(P: pila, X: elemento, resp: lógico)
 Pop(P: pila, X: elemento, resp: lógico)
 Top(P: pila, X: elemento, resp: lógico)
TDA PILA

Implementación

Vectores Listas enlazadas


 Variables estáticas  Variables dinámicas
 Tamaño máximo fijo  No riesgo de overflow
 Peligro de desbordamiento  Limitadas por memoria disponible
(overflow)  Cada elemento necesita más
 Uso ineficiente de memoria memoria (guardar dirección
siguiente)
 Uso eficiente de memoria

Problema común: underflow o subdesbordamiento


TDA PILA

Implementación con vectores


 Definición de tipos  Operación Push

ELEMENTO = T; Algoritmo PUSH (P: Pila, X:


PILA = registro de ELEMENTO, ok: lógico) es
tope: numérico; resp: lógico;
INICIO
arreglo: vector[1..MAX] de
Llena?(P,resp);
ELEMENTO;
si resp entonces
finregistro; ok:= falso;
sino
P.tope:= P.tope + 1;
P.arreglo[P.tope]:= X;
ok:= cierto;
finsi;
FIN
TDA PILA

Implementación con vectores


 Operación Pop  Operación Top
Algoritmo POP (P: PILA, X: Algoritmo TOP (P: PILA, X:
ELEMENTO, ok: lógico) es ELEMENTO, ok:lógico) es

INICIO resp: lógico;


Vacia(P, resp);
INICIO
si resp entonces
ok:= falso; {no hay Vacia?(P, resp);
elementos q sacar} si resp entonces
sino ok:= falso; {pila vacía}
X:= P.arreglo[P.tope]; sino
P.tope:= P.tope -1; ok:= cierto;
ok:= cierto; X:= P.arreglo[P.tope];
finsi;
finsi;
FIN
FIN
TDA PILA

Implementación con listas enlazadas


 Definición de tipos
ELEMENTO = T;
NODO = registro de PILA = registro de
info: ELEMENTO; longitud:
numerico;
sgte: puntero a NODO;
prim: POSICIÓN;
finregistro;
finregistro;
POSICION = puntero a NODO;
TDA PILA

Implementación con listas enlazadas


 Operación Push
Algoritmo PUSH (P: PILA, X: ELEMENTO, ok: logico) es
resp: logico;
temp: POSICION;
INICIO
Llena?(P,resp); {resp=falso si no se puede reservar más memoria}
si resp entonces
ok := falso;
Escribir “Pila llena”;
sino
Obtener(temp);
temp.info := X;
temp.sgte := P.prim; {será nil si la pila estaba vacía}
P.prim := temp;
P.longitud := P.longitud +1;
ok := cierto;
finsi
FIN
TDA PILA

Implementación con listas enlazadas


 Operación Pop
Algoritmo POP (P: PILA, X: ELEMENTO, ok: logico) es
resp: lógico;
temp: POSICION;
INICIO
Vacia?(P, resp);
si resp entonces
ok := falso; {la pila está vacía}
sino {procedemos a sacar el último elemento insertado}
temp := P.prim;
P.prim := temp.sgte; {que será nil si sólo hay un elemento en la pila}
X := temp.info;
Liberar(temp);
ok := cierto;
finsi;
FIN
TDA PILA

Implementación con listas enlazadas


 Operación Top
Algoritmo TOP(P: PILA, X: ELEMENTO, ok: lógico) es
resp: lógico;
INICIO
Vacia?( P, resp);
si resp entonces
ok:= falso; {Pila vacia}
sino
X := P.prim.info;
ok:= cierto;
finsi;
FIN
TDA PILA

Aplicaciones de las pilas


 Gran uso en compiladores y SO’s.
 Entornos donde haya que recuperar el último valor que se
almacenó (backtracking)
 Algunas aplicaciones:
 Equilibrado de símbolos
 Llamadas a subprogramas
 Eliminación de recursividad
 Tratamiento de expresiones aritméticas
 Evaluación de expresiones postfijas
 Conversión infija a postfija
 Borrado de caracteres en un editor de textos
TDA PILA Aplicaciones de las pilas

Equilibrado de símbolos
 Se van leyendo los caracteres. Cuando se encuentra un elemento clave
(paréntesis, corchete…) se trata según su tipo:
 Si es de apertura: se mete en la pila.
 Si es de cierre:
 Si la pila está vacía error.
 Si la pila no está vacía:

 Si la cima es el correspondiente símbolo de apertura se extrae.

 Si no lo es error.
 Si al final la pila no está vacía error
TDA PILA Aplicaciones de las pilas

Llamadas a subprogramas
 Al llamar a un subprograma se necesita guardar:
 Estado de las variables locales del programa que llama Registro de
 Dirección del programa en la que se hizo la llamada activación
 Al hacer la llamada esta información se mete en la cima de una pila.
 Al terminar el subprograma, se saca la cima y se recupera el estado del
momento de la llamada vuelve al punto de ejecución donde se hizo la llamada.
 El subprograma puede llamar a otros subprogramas y así sucesivamente.
 Permite implementar la recursión.

Peligro: rebasamiento de la pila


TDA PILA Aplicaciones de las pilas

Eliminación de recursividad
 La recursión consume muchos recursos (memoria).

 Recursión de cola: la llamada recursiva está en la última línea. Para eliminarla:


 Se necesita: argumentos del algoritmo pasados por valor o referencia si son los
mismos argumentos los que se pasan a la llamada recursiva.
 Se asignan a los argumentos los valores que se van a pasar en la llamada
recursiva.
 Salto (goto) al principio de la rutina.

 Para transformar algoritmo recursivo en iterativo:


 Se guarda en pilas el estado del problema en el momento de la llamada recursiva.
 Se vuelve al principio de la rutina mediante una estructura iterativa.
 La vuelta atrás de la recursión se consigue sacando los valores de las pilas
TDA PILA Aplicaciones de las pilas

Tratamiento de expresiones aritméticas

 Notación infija: a + b
 Notación prefija: + a b
 Notación postfija: a b +

 Problema: distinción de prioridades en notación infija. Ej:


evaluar a + b * c
 Soluciones:
 Empleo de paréntesis.
 Conversión a notación prefija o postfija.

 Ventajas de la notación postfija:


 No hace falta conocer reglas de prioridad.
 No hace falta emplear paréntesis.
TDA PILA Aplicaciones de las pilas
Tratamiento de expresiones aritméticas:

Evaluación de expresiones postfijas

 Se lee la expresión elemento a elemento.


 Si es un operando se mete en una pila
 Si es un operador, se extraen los dos últimos elementos introducidos en la
pila, se aplica el operador sobre ellos y el resultado se guarda en la pila.

Ejemplo: 6 4 + 2 5 * +
TDA PILA Aplicaciones de las pilas
Tratamiento de expresiones aritméticas:

Conversión infija a postfija


 Operandos: se colocan directamente en la salida.

 Operadores: si la pila está vacía, lo metemos en la pila. Si no:


 Si en la cima se encuentra un operador de menor prioridad: push()
 Si no: pop() hasta que en la cima haya uno de menor prioridad, un paréntesis de apertura o la pila esté vacía. Entonces se hace un
push().

 Paréntesis:
 de apertura ‘(‘ : se mete en la pila.
 de clausura ’)’ : se van llevando los operadores de la pila a la salida hasta que se encuentra uno de apertura, que se saca de la pila.

 Para finalizar, si en la pila aún queda algún operador, se lleva a la salida.


TDA PILA Aplicaciones de las pilas

Borrado de caracteres en un editor de texto

 Se van leyendo los caracteres de uno en uno.


 Si el carácter no es de borrado ni de eliminación de línea, se mete en
la pila.
 Si el carácter es de borrado, se hace un pop(), para sacar el elemento
cima de la pila.
 Si el carácter es de eliminación de línea se vacía toda la pila.

Ejemplo: si # es el carácter de borrado,

inp#foron##mátiz#ca informática
TDA COLA
Definición

Def: una cola es una lista ordenada de elementos en la que todas las
inserciones se realizan por un extremo (frente o principio) y las
supresiones se realizan por el otro (final).

Estructura FIFO (First In First Out): “primero en entrar primero


en salir”
TDA COLA

Operaciones básicas
 QUEUE: encolar, meter

 DEQUEUE: desencolar, sacar


TDA COLA

Operaciones
 Crear_cola(C: cola, ok: lógico)
 Borrar_cola(C: cola, ok: lógico)
 Vacía?(C: cola, resp: lógico)
 Llena?(C: cola, resp: lógico)
 Queue(C: cola, X: elemento, resp: lógico)
 Dequeue(C: cola, X: elemento, resp: lógico)
 Tamaño(C: cola, N: numérico)
TDA COLA

Implementación con listas enlazadas


 Definición de tipos
ELEMENTO = T;
NODO = registro de COLA = registro de
info: ELEMENTO; tam: numerico;
sgte: puntero a NODO; prim, ult:
POSICIÓN;
fin registro;
fin registro;
POSICION = puntero a NODO;
TDA COLA

Implementación con listas enlazadas


 Operación QUEUE
Algoritmo QUEUE(C: cola, X: ELEMENTO, resp: lógico) es
temp: POSICION;
INICIO
Llena?(C,resp);
si resp = cierto entonces
Escribir “Cola llena”;
resp := falso;
sino {la cola no está llena, por lo que procedemos a añadir el elemento}
Obtener(temp);
temp .info := X;
temp.sgte := nil; {porque va a ser el último}
Vacía?(C,resp);
si resp = cierto entonces {será el primero}
C.prim := temp;
sino C.ult.sgte := temp; {será el siguiente al último}
finsi;
C.ult := temp; {porque es el nuevo último elemento}
C.longitud := C.longitud + 1; {pues ahora hay un elemento más en la
cola}
finsi;
TDA COLA

Implementación con listas enlazadas


 Operación DEQUEUE
Algoritmo DEQUEUE(C: cola, X: ELEMENTO, resp: lógico) es
temp: POSICION;
tam: numérico;
INICIO
Vacía?(C,resp);
si resp = cierto entonces
Escribir “Cola vacía”;
resp := falso;
sino
temp := C.prim;
E := temp.info;
Tamaño(C,tam);
si tam = 1 entonces
C.ult := nil;
finsi;
C.prim := temp.sgte; {si sólo había un elemento, será nil}
Liberar(temp);
C.longitud := C.longitud -1;
finsi;
FIN
TDA COLA

Implementación con vectores


 Si el principio de la cola es fijo en la primera posición del vector y el final es
variante para eliminar un elemento de la cola hay que desplazar todos los
demás una posición (Dequeue() es ineficiente).

 Si principio y final de la cola son variantes, no hacen falta desplazamientos.


 Problema: la cola puede desbordarse teniendo celdas libres.
TDA COLA

Implementación con vectores


 Solución: VECTOR CIRCULAR cuando algún índice llega al final,
vuelve al comienzo del vector

 Definición de tipos
ELEMENTO = T;
COLA = registro de
prim, ult, tam: numérico;
arreglo: vector[1..MAX] de
ELEMENTO;
finregistro;

Para saber si la cola está llena o


vacía, su tamaño se controla con el
campo tam del registro
TDA COLA

Implementación con vectores


 Operación QUEUE
Algoritmo QUEUE(C: COLA, X: ELEMENTO, resp: lógico) es
INICIO
Llena?(C,resp);
si resp = cierto entonces {la cola está llena}
Escribir “Cola llena”;
resp := falso;
sino {la cola no está llena, por lo que procedemos a añadir el elemento}
C.ult := (C.ult + 1) mod MAX; {hacemos que ult avance de forma circular}
C.arreglo[C.ult] := X;
C.tam := C.tam +1; {pues ahora hay un elemento más en la cola}
finsi;
FIN
TDA COLA

Implementación con vectores


 Operación Dequeue
Algoritmo DEQUEUE(C: COLA, X: ELEMENTO, resp: lógico) es
INICIO
Vacía?(C,resp);
si resp = cierto entonces {la cola está vacía}
Escribir “Cola vacía”;
resp := falso;
sino {hay al menos un elemento}
X := C.arreglo[C.prim];
C.prim := (C.prim + 1) mod MAX;
C.longitud := C.longitud -1;
finsi;
FIN
TDA COLA

Aplicaciones de las colas

Principalmente: gestión de recursos


 Sistemas de tiempo compartido: los recursos (CPU, memoria, …) se
asignan a los procesos que están en cola de espera en el orden en el
que fueron introducidos.

 Colas de impresión: al intentar imprimir varios documentos a la vez o la


impresora está ocupada, los trabajos se almacenan en una cola según
el orden de llegada.

 Simulación por computadora de situaciones reales: una cola de clientes


en un supermercado o el tiempo de espera para ser atendidos por un
operador de una línea telefónica.

También podría gustarte