Guia 6 Pilas y Colas
Guia 6 Pilas y Colas
Guia 6 Pilas y Colas
1. OBJETIVOS
Que el estudiante:
2. INTRODUCCION TEORICA
Pila
Definición
Una pila (stack) es una colección ordenada de elementos en la cual se pueden insertar
nuevos elementos por un extremo y se pueden retirar otros por el mismo extremo; ese
extremo se llama ``la parte superior o tope'' de la pila.
Manejo de la pila: UEPS (LIFO)
• Las operaciones básicas de una pila son “push” (empujar, meter) y “pop” (sacar)
o Push: añade un nuevo elemento a la pila
o Pop: elimina un elemento de la pila
• Otras operaciones usualmente incluidas en el tipo de dato abstracto pila son:
o EstaVacia (estáVacia): verifica si la pila está vacía
o EstaLLena (estáLlena): verifica si la pila está llena
Aplicaciones de Pilas
• Navegador Web
o Se almacenan los sitios previamente visitados
o Cuando el usuario quiere regresar (presiona el botón de retroceso),
simplemente se extrae la última dirección (pop) de la pila de sitios visitados.
• Editores de texto
o Los cambios efectuados se almacenan en una pila
o Usualmente implementada como arreglo
o Usuario puede deshacer los cambios mediante la operación “undo”, la cual
extraer el estado del texto antes del último cambio realizado.
• La recursividad se simula en un computador con la ayuda de una pila.
Especificacion ENTERO
variable
num: entero
operaciones
IngEntero : no retorna valor
VisEntero : no retorna valor
ecuaciones
IngEntero lee los datos de un valor entero
VisEntero visualiza los datos del valor entero
finespecificacion
Especificacion PILA
variable
e: ENTERO
sgte:PILA
tope: entero
i: entero
operaciones
CREAR : no retorna valor
CREAR(raiz, TAMANO) : no retorna valor
Ocupada : retorna valor logico
VACIA : retorna valor logico
METER(raiz, dato) : retorna valor logico
SACAR(raiz) : retorna valor logico
VER(raiz) : no retorna valor
ecuaciones
CREAR permite crear un nodo
CREAR(raiz, TAMANO) permite crear la pila asignando un tamaño a traves de la
variable TAMAÑO a la pila con cabecera raiz.
Ocupada retorna verdadero si la pila llego al tope de su tamaño, en caso contrario
retorna falso
VACIA retorna verdadero si la pila esta vacia, en caso contrario retorna falso.
METER(raiz, dato) retorna verdadero si el TAD dato se ingreso correctamente a la
pila con cabecera raiz, en caso contrario retorna falso.
SACAR(raiz) retorna verdadero si el TAD de la cima de la pila con cabecera raiz se
saco correctamente de la pila, en caso contrario retorna falso.
VER(raiz) permite visualizar los datos de la pila con cabecera raiz
finespecificacion
predicado Ocupada
si (i>=tope)
Ocupadaverdadero
Sino
Ocupadafalso
Finsi
finOcupada
predicado VACIA
si(i<=0)
VACIAverdadero
Sino
VACIAfalso
finsi
finVACIA
predicado METER(raiz, dato)
si (no Ocupada())
crear(n)
asignar(n,dato)
si (raiz = nulo)
raiz n
sgte(n)nulo
sino
sgte(n)raiz
raizn
finsi
ii+1
METERverdadero
sino
METERfalso
finsi
finMETER
predicado SACAR(raiz)
si( no VACIA())
qsgte(raiz)
liberar( raiz)
raizq
ii-1
SACARverdadero
Sino
SACARfalso
finsi
finSACAR
IMPLEMENTACIÓN DEL TAD
#include "iostream.h"
#include "conio.h"
class ENTERO{
int num;
public:
void IngEntero(){cout<<"\n Ingrese un entero: ";cin>>num;}
void VisEntero(){ cout<<" "<<num; }
};
class PILA{
ENTERO e;
PILA *sgte;
int tope;
int i;
public:
PILA(){}
PILA(PILA *&raiz,int TAMANO){
tope=TAMANO;
raiz=NULL;
i=0;
}
bool Ocupada(){
if (i>=tope)
return true;
else return false;
}
bool VACIA(){
if(i<=0) return true;
else return false;
}
}
else return false;
}
bool SACAR(PILA *&raiz){
PILA *q;
if(!VACIA()){
q=raiz->sgte;
delete raiz;
raiz=q;
i--;
return true; }
else return false;
}
PILA *raiz=NULL;
PILA p(raiz,3);
for(;;){
cout<<"\n Poner <1>\n Quitar <2>\n Ver <3>\n Salir <4>";
op=getch();
switch(op){
case '1': dato.IngEntero();
if(p.METER(raiz,dato)) cout<<"se ingreso correctamente";
else cout<<"la pila esta llena";
break;
case '2': if(p.SACAR(raiz)) cout<<"se retiro correctamente";
else cout<<"\n La pila esta vacia";
break;
case '3': p.VER(raiz);break;
case '4': return 0;
}
}
}
Colas
Definición
Una cola es una estructura de datos de acceso restrictivo a sus elementos. Un ejemplo
sencillo es la cola del cine o del autobús, el primero que llegue será el primero en entrar, y
afortunadamente en un sistema informático no se cuela nadie salvo que el programador lo
diga.
Las colas serán de ayuda fundamental para ciertos recorridos de árboles y grafos.
Las colas ofrecen dos operaciones fundamentales, que son encolar (al final de la cola) y
desencolar (del comienzo de la cola). Al igual que con las pilas, la implementación de las
colas suele encapsularse, es decir, basta con conocer las operaciones de manipulación
de la cola para poder usarla, olvidando su implementación interna
Meter
Sacar
EstaOcupada
EstaVacia
Ejemplo 2
Especificacion ENTERO
variable
num: entero
operaciones
IngEntero : no retorna valor
VisEntero : no retorna valor
ecuaciones
IngEntero lee los datos de un valor entero
VisEntero visualiza los datos del valor entero
finespecificacion
Especificacion COLA
variable
e: ENTERO
sgte:COLA
tope: entero
i: entero
operaciones
CREAR : no retorna valor
CREAR(raiz, TAMANO) : no retorna valor
Ocupada : retorna valor logico
VACIA : retorna valor logico
METER(raiz, dato) : retorna valor logico
SACAR(raiz) : retorna valor logico
VER(raiz) : no retorna valor
ecuaciones
CREAR permite crear un nodo
CREAR(raiz, TAMANO) permite crear la cola asignando un tamaño a traves de la
variable TAMAÑO a la cola con cabecera raiz.
Ocupada retorna verdadero si la cola llego al tope de su tamaño, en caso contrario
retorna falso
VACIA retorna verdadero si la cola esta vacia, en caso contrario retorna falso.
METER(raiz, dato) retorna verdadero si el TAD dato se ingreso correctamente a la
cola con cabecera raiz, en caso contrario retorna falso.
SACAR(raiz) retorna verdadero si el TAD de la parte del frente de la cola con
cabecera raiz se saco correctamente, en caso contrario retorna falso.
VER(raiz) permite visualizar los datos de la cola con cabecera raiz
finespecificacion
predicado Ocupada
si (i>=tope)
Ocupadaverdadero
Sino
Ocupadafalso
Finsi
finOcupada
predicado VACIA
si(i<=0)
VACIAverdadero
Sino
VACIAfalso
finsi
finVACIA
#include "iostream.h"
#include "conio.h"
class ENTERO{
int num;
public:
void IngEntero(){cout<<"\n Ingrese un entero: ";cin>>num;}
void VisEntero(){ cout<<" "<<num; }
};
class COLA{
ENTERO e;
COLA *sgte;
int tope;
int i;
public:
COLA(){}
COLA(COLA *&raiz,int TAMANO){
tope=TAMANO;
raiz=NULL;
i=0;
}
bool Ocupada(){
if (i>=tope)
return true;
else return false;
}
bool VACIA(){
if(i<=0) return true;
else return false;
}
COLA *raiz=NULL;
COLA p(raiz,3);
for(;;){
cout<<"\n Poner <1>\n Quitar <2>\n Ver <3>\n Salir <4>";
op=getch();
switch(op){
case '1': dato.IngEntero();
if(p.METER(raiz,dato)) cout<<"se ingreso correctamente";
else cout<<"la cola esta llena";
break;
case '2': if(p.SACAR(raiz)) cout<<"se retiro correctamente";
else cout<<"\n La cola esta vacia";
break;
case '3': p.VER(raiz);break;
case '4': return 0;
}
}
}
VENTAJAS Y DESVENTAJAS DE LAS PILAS Y COLAS
4. PROCEDIMIENTO
Ejercicio 1
Una pila con capacidad para 10 números enteros como máximo, tiene las siguientes operaciones:
Cuando se retira un numero que no este en la cima debe primero leerse el numero que se va a retirar, si el
numero buscado se encuentra en la cima de la pila debe generarse el siguiente mensaje de error:
Pila principal
20 cima
15
Cada vez que su programa retire un
elemento como el valor 11 que no esta 11
en la cima de la pila, su programa debe
visualizar la siguiente información: 12
fondo
20
12
Presione <enter> para mostrar la pila actualizada
cima
20
15
12
fondo
NOTA
Implemente la pila en C usando asignación dinamica
Especificacion ENTERO
variable
num: entero
operaciones
IngEntero : no retorna valor
VisEntero : no retorna valor
RetEntero : retorna un valor entero
ecuaciones
IngEntero lee los datos de un valor entero
VisEntero visualiza los datos del valor entero
finespecificacion
Especificacion PILA
variable
e: ENTERO
sgte:PILA
raiz: PILA
tope: entero
i: entero
operaciones
CREAR : no retorna valor
CREAR(TAMANO) : no retorna valor
Ocupada : retorna valor logico
VACIA : retorna valor logico
METER(dato) : retorna valor logico
SACAR() : retorna valor logico
VER() : no retorna valor
RetCima(valor): retorna valor logico
RetLongitud : retorna un entero
RetElemento(max, valor) : no retorna valor
ExtraerElemento(aux, prin, dato): retorna valor lógico
ecuaciones
CREAR permite crear un nodo
CREAR(raiz, TAMANO) permite crear la pila asignando un tamaño a traves de la
variable TAMAÑO a la pila con cabecera raiz.
Ocupada retorna verdadero si la pila llego al tope de su tamaño, en caso contrario
retorna falso
VACIA retorna verdadero si la pila esta vacia, en caso contrario retorna falso.
METER(raiz, dato) retorna verdadero si el TAD dato se ingreso correctamente a la
pila con cabecera raiz, en caso contrario retorna falso.
SACAR(raiz) retorna verdadero si el TAD de la cima de la pila con cabecera raiz se
saco correctamente de la pila, en caso contrario retorna falso.
VER(raiz) permite visualizar los datos de la pila con cabecera raiz
RetCima(valor) retorna un valor de verdad si la pila esta vacia, de lo contrario
retorna falso. Si la pila tiene algun dato valor retorna el dato que esta en la cima
RetLongitud retorna un entero que indica el tamaño de la pila
RetElemento(max, valor) según la posición de un elemento indicado por max,
devuelve en valor el dato que esta en esa posición de la pila
ExtraerElemento(aux, prin, dato) retorna un valor de verdad si la extracción de un
elemento fue correcta, de lo contrario devuelve falso. La funcion para operar
necesita como entrada dos pilas y la información del dato a extraer.
finespecificacion
#include "iostream.h"
#include "conio.h"
class ENTERO{
int num;
public:
void IngEntero(){cout<<"\n Ingrese un entero: ";cin>>num;}
void VisEntero(){ cout<<" "<<num; }
int RetEntero(){ return num; }
};
class PILA{
ENTERO e;
PILA *sgte,*raiz;
int tope;
int i;
public:
PILA(){}
PILA(int TAMANO){
tope=TAMANO;
raiz=NULL;
i=0;
}
bool Ocupada(){
if (i>=tope)
return true;
else return false;
}
bool VACIA(){
if(i<=0) return true;
else return false;
}
bool METER(ENTERO dato){
if (!Ocupada()){
PILA *n=new PILA;
n->e=dato;
if (raiz == NULL){
n->tope=1;
raiz = n;
n->sgte=NULL; }
else { n->sgte=raiz;
n->tope=raiz->tope+1;
raiz=n;
}
i++;
return true;
}
else return false;
}
bool SACAR(){
PILA *q;
if(!VACIA()){
q=raiz->sgte;
delete raiz;
raiz=q;
i--;
return true; }
else return false;
}
void VER(){
PILA *q=raiz;
cout<<"\n";
while(q!=NULL){
q->e.VisEntero();
q=q->sgte;
}
}
bool RetCima(ENTERO &valor){
if(raiz!=NULL){
valor=raiz->e;
return true;
}
else return false;
}
int RetLongitud(){ return i; }
void RetElemento(int max, ENTERO &valor){
PILA *q=raiz;
for(int k=0; k<max; k++)
q=q->sgte;
valor=q->e;
}
bool ExtraerElemento(PILA &aux, PILA &prin, ENTERO dato){
int t,k,j;
ENTERO valor;
bool SALIR=false;
if(prin.RetCima(valor)){
if(valor.RetEntero()!=dato.RetEntero()){
j=0;
while ((j<prin.RetLongitud()) && !SALIR){
prin.RetElemento(j,valor);
if(dato.RetEntero()==valor.RetEntero()) SALIR =true;
else j++;
}
if(SALIR){
j= prin.RetLongitud()-j;
cout<<"\n long="<<prin.RetLongitud()<<" j="<<j;
t = prin.RetLongitud()-j;
k=0;
while(k<t){
prin.RetCima(valor);
aux.METER(valor);
prin.SACAR();
k++;
}
cout<<"\n ESTADO INICIAL DE PILAS AUXILIAR Y PRINCIPAL t="<<t;
aux.VER();
prin.SACAR();
prin.VER();
k=0;
while(k<t){
aux.RetCima(valor);
prin.METER(valor);
aux.SACAR();
k++;
}
cout<<"\n ESTADO FINAL DE LAS PILAS AUXILIAR Y PRINCIPAL";
aux.VER();
prin.VER();
getch();
return SALIR;
}
else
cout<<"\n ERROR: el dato no existe en la PILA";
}
else
cout<<"\n ERROR: el dato esta en la cima";
}
else
cout<<"\n ERROR: pila vacia";
getch();
return SALIR;
}
};
Ejercicio 2
Por ejemplo
Para una pila de tamaño 10, puede ingresar la palabra UNO, luego CUANDO pero
si intenta ingresar la palabra TRES no podrá porque sobrepasa el tamaño. Si aplica
la operación sacar la palabra inmediata a salir será CUANDO
FONDO CIMA
U N O C U A N D O
Ejercicio 3
Escriba un programa en C que implemente una pila con las siguientes características. Los elementos a
empilar son varias cadenas de tres tipos de longitud. Los de longitud 1 contienen la cadena “1”, los de
longitud 2 contienen la cadena “22” y los de longitud 3 contienen la cadena “333”. La pila tendrá un tamaño
máximo de 5 caracteres. Observe un ejemplo de una secuencia de posibles operaciones.
vacía
push push
push push push 2 pop pop
22 22
333 333 22
no podrá 2 2
3 ya que 3 3 3 2
supera la
3 pila 3 3 3 2 2
3 3
3 3 2 2
Observación:
La pila debe implementar las operaciones básicas y emitir mensajes de error cuando se
produzca algo incorrecto
La implementación puede ser hecha con arreglos o listas enlazadas dinámicamente.
Ejercicio 4
Se desea crear el algoritmo y el programa que permita crear una cola basado en dos pilas
Por ejemplo
Suponemos que hemos ingresado algunos datos a la pila y cuando sacamos un valor realizamos tres pasos
9 8
10 5 5 9
5 10 10 10
8 9 9 5
Paso 2 Paso 3
Ejercicio 5 Paso 1
Una cola medieval se comporta como una cola ordinaria, con la única diferencia de que los elementos
almacenados en ella se dividen en dos estamentos: nobles y plebeyos. Dentro de cada estamento, los
elementos deben ser atendidos en orden de llegada; pero siempre que haya nobles en la cola, estos deben ser
atendidos antes que los plebeyos. Se pide:
Escribir un programa en C que implemente la cola medieval, especificando tipo abstracto de datos para las
colas medievales que disponga de las operaciones básicas de una cola (ingresar, retirar, preguntar si esta
vacía o llena). La implementación puede ser hecha con arreglos o listas enlazadas dinámicamente.
Ejercicio 6
Cree un programa para una agencia de empleos en el cual su base de datos que es una lista simple dinamica
sirve para registrar a las personas que vienen con sus curriculos. Esta lista que es la principal tiene un limite
maximo de 5 personas, asi que cuando se supera ese tamaño los que no alcanzan van a una cola de espera
que tambien es una lista simple dinamica sin limite de tamaño. Cuando hay un empleo disponible sale de la
lista principal el primero que esta en espera y si hay en la cola de espera gente esperando entra a la lista
principal.
5. ANALISIS DE RESULTADOS
6. BIBLIOGRAFIA