Вы находитесь на странице: 1из 31

Pilas y Colas

ndice

TDA Pila

Definicin y operaciones bsicas


Operaciones e implementacin
Aplicaciones

TDA Cola

Definicin y operaciones bsicas


Operaciones e implementacin
Aplicaciones

TDA PILA
Definicin
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
bsicas

PUSH: apilar, meter

POP: desapilar, sacar

TOP: cima, tope

TDA PILA

Operaciones

Crear_pila(P: pila, ok: lgico)

Borrar_pila(P: pila, ok: lgico)

Vaca?(P: pila, resp: lgico)

Llena?(P: pila, resp: lgico)

Push(P: pila, X: elemento, resp: lgico)

Pop(P: pila, X: elemento, resp: lgico)

Top(P: pila, X: elemento, resp: lgico)

TDA PILA

Implementacin
Listas enlazadas

Vectores

Variables estticas
Tamao mximo fijo

Peligro de
desbordamiento
(overflow)
Uso ineficiente de
memoria

Variables dinmicas
No riesgo de overflow
Limitadas por memoria
disponible
Cada elemento necesita ms
memoria (guardar direccin
siguiente)
Uso eficiente de memoria

Problema comn: underflow o subdesbordamiento

TDA PILA

Implementacin con vectores

Definicin de
tipos
ELEMENTO = T;
PILA = registro de
tope: numrico;
arreglo: vector[1..MAX]
de ELEMENTO;
finregistro;

Operacin Push

Algoritmo PUSH (P: Pila, X:


ELEMENTO, ok: lgico) es
resp: lgico;
INICIO
Llena?(P,resp);
si resp entonces
ok:= falso;
sino
P.tope:= P.tope + 1;
P.arreglo[P.tope]:= X;
ok:= cierto;
finsi;
FIN

TDA PILA

Implementacin con vectores

Operacin Pop

Algoritmo POP (P: PILA, X:


ELEMENTO, ok: lgico) es
INICIO
Vacia(P, resp);
si resp entonces
ok:= falso; {no hay
elementos q sacar}
sino
X:= P.arreglo[P.tope];
P.tope:= P.tope -1;
ok:= cierto;
finsi;
FIN

Operacin Top

Algoritmo TOP (P: PILA, X:


ELEMENTO, ok:lgico) es
resp: lgico;
INICIO
Vacia?(P, resp);
si resp entonces
ok:= falso; {pila vaca}
sino
ok:= cierto;
X:= P.arreglo[P.tope];
finsi;
FIN

TDA PILA

Implementacin con listas


enlazadas

Definicin de
tipos
ELEMENTO = T;
NODO = registro de
info: ELEMENTO;
sgte: puntero a NODO;
finregistro;
POSICION = puntero a
NODO;

PILA = registro de
longitud: numerico;
prim: POSICIN;
finregistro;

TDA PILA

Implementacin con listas


enlazadas

Operacin 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 ms
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 vaca}
P.prim := temp;
P.longitud := P.longitud +1;
ok := cierto;
finsi

TDA PILA

Implementacin con listas


enlazadas

Operacin Pop

Algoritmo POP (P: PILA, X: ELEMENTO, ok: logico) es


resp: lgico;
temp: POSICION;
INICIO
Vacia?(P, resp);
si resp entonces
ok := falso; {la pila est vaca}
sino {procedemos a sacar el ltimo elemento insertado}
temp := P.prim;
P.prim := temp.sgte; {que ser nil si slo hay un elemento en la
pila}
X := temp.info;
Liberar(temp);
ok := cierto;
finsi;

TDA PILA

Implementacin con listas


enlazadas

Operacin Top

Algoritmo TOP(P: PILA, X: ELEMENTO, ok: lgico) es


resp: lgico;
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 SOs.

Entornos donde haya que recuperar el ltimo valor que


se almacen (backtracking)

Algunas aplicaciones:

Equilibrado de smbolos
Llamadas a subprogramas
Eliminacin de recursividad
Tratamiento de expresiones aritmticas

Evaluacin de expresiones postfijas


Conversin infija a postfija

Borrado de caracteres en un editor de textos

TDA PILA

Aplicaciones de las
pilas

Equilibrado de smbolos

Se van leyendo los caracteres. Cuando se encuentra un elemento


clave (parntesis, corchete) se trata segn su tipo:

Si es de apertura: se mete en la pila.

Si es de cierre:
Si la pila est vaca
error.
Si la pila no est vaca:
Si la cima es el correspondiente smbolo de apertura se
extrae.
Si no lo es
error.
Si al final la pila no est vaca
error

Aplicaciones de las
pilas

TDA PILA

Llamadas a subprogramas

Al llamar a un subprograma se necesita guardar:

Estado de las variables locales del programa que llama


Registro de
Direccin del programa en la que se hizo la llamada activacin

Al hacer la llamada esta informacin 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 ejecucin donde se hizo la
llamada.

El subprograma puede llamar a otros subprogramas y as sucesivamente.

Permite implementar la recursin.

Peligro: rebasamiento de la
pila

TDA PILA

Aplicaciones de las
pilas
de

Eliminacin
recursividad

La recursin consume muchos recursos (memoria).

Recursin de cola: la llamada recursiva est en la ltima lnea. 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 atrs de la recursin se consigue sacando los valores de las pilas

Aplicaciones
de
las
TDA PILA
pilas
Tratamiento de expresiones

aritmticas

Notacin infija: a + b
Notacin prefija: + a b
Notacin postfija: a b +
Problema: distincin de prioridades en notacin
infija. Ej: evaluar a + b * c
Soluciones:

Empleo de parntesis.

Conversin a notacin prefija o postfija.


Ventajas de la notacin postfija:

No hace falta conocer reglas de prioridad.

No hace falta emplear parntesis.

Aplicaciones
de
las
TDA PILA
pilas
Tratamiento de expresiones aritmticas:

Evaluacin de expresiones postfijas

Se lee la expresin 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 * +

Aplicaciones
de
las
TDA PILA
pilas
Tratamiento de expresiones aritmticas:

Conversin infija a postfija

Operandos: se colocan directamente en la salida.

Operadores: si la pila est vaca, 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 parntesis de apertura o la pila est vaca. Entonces
se hace un push().

Parntesis:

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 an queda algn 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 carcter no es de borrado ni de eliminacin de lnea, se
mete en la pila.
Si el carcter es de borrado, se hace un pop(), para sacar el
elemento cima de la pila.
Si el carcter es de eliminacin de lnea se vaca toda la pila.

Ejemplo: si # es el carcter de borrado,


inp#foron##mtiz#ca

informtica

TDA COLA
Definicin
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
bsicas

QUEUE: encolar, meter

DEQUEUE: desencolar,
sacar

TDA COLA

Operaciones

Crear_cola(C: cola, ok: lgico)

Borrar_cola(C: cola, ok: lgico)

Vaca?(C: cola, resp: lgico)

Llena?(C: cola, resp: lgico)

Queue(C: cola, X: elemento, resp: lgico)

Dequeue(C: cola, X: elemento, resp: lgico)

Tamao(C: cola, N: numrico)

TDA COLA

Implementacin con listas


enlazadas

Definicin de
tipos
ELEMENTO = T;
NODO = registro de
info: ELEMENTO;
sgte: puntero a NODO;
fin registro;
POSICION = puntero a
NODO;

COLA = registro de
tam: numerico;
prim, ult:
POSICIN;
fin registro;

TDA COLA

Implementacin con listas


enlazadas

Operacin QUEUE

Algoritmo QUEUE(C: cola, X: ELEMENTO, resp: lgico) 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 aadir el elemento}
Obtener(temp);
temp .info := X;
temp.sgte := nil; {porque va a ser el ltimo}
Vaca?(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 ms en la
cola}
finsi;
FIN

TDA COLA

Implementacin con listas


enlazadas

Operacin DEQUEUE

Algoritmo DEQUEUE(C: cola, X: ELEMENTO, resp: lgico) es


temp: POSICION;
tam: numrico;
INICIO
Vaca?(C,resp);
si resp = cierto entonces
Escribir Cola vaca;
resp := falso;
sino
temp := C.prim;
E := temp.info;
Tamao(C,tam);
si tam = 1 entonces
C.ult := nil;
finsi;
C.prim := temp.sgte; {si slo haba un elemento, ser nil}
Liberar(temp);
C.longitud := C.longitud -1;
finsi;
FIN

TDA COLA

Implementacin con vectores

Si el principio de la cola es fijo en la primera posicin del vector y el


final es variante para eliminar un elemento de la cola hay que
desplazar todos los dems una posicin (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

Implementacin con vectores

Solucin: VECTOR CIRCULAR


final, vuelve al

cuando algn ndice llega al


comienzo del vector

Definicin de
tipos
ELEMENTO = T;
COLA = registro de
prim, ult, tam: numrico;
arreglo: vector[1..MAX]
de ELEMENTO;
finregistro;

Para saber si la cola est llena


o vaca, su tamao se controla
con el campo tam del registro

TDA COLA

Implementacin con vectores

Operacin QUEUE
Algoritmo QUEUE(C: COLA, X: ELEMENTO, resp: lgico) 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 aadir 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 ms en la cola}
finsi;
FIN

TDA COLA

Implementacin con vectores

Operacin Dequeue

Algoritmo DEQUEUE(C: COLA, X: ELEMENTO,


lgico) es
INICIO
Vaca?(C,resp);
si resp = cierto entonces {la cola est vaca}
Escribir Cola vaca;
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

resp:

TDA COLA

Aplicaciones de las colas


Principalmente: gestin de recursos

Sistemas de tiempo compartido: los recursos (CPU, memoria,


) se asignan a los procesos que estn en cola de espera en
el orden en el que fueron introducidos.

Colas de impresin: al intentar imprimir varios documentos a


la vez o la impresora est ocupada, los trabajos se almacenan
en una cola segn el orden de llegada.

Simulacin 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 lnea telefnica.

Вам также может понравиться