Professional Documents
Culture Documents
ASIGNATURA
TEMA
PROFESOR
ALUMNO
CODIGO
FECHA
CICLO
TURNO
SEMESTRE
1.
Estructura de Informacin
PILAS Y COLAS
Carlos A. Ruiz De La Cruz Melo
28 / 10 / 2010
IV
1-A y 3-B
2010-III
OBJETIVOS
Que el estudiante:
2.
INTRODUCCION TEORICA
Pila
Definicin
Una pila (stack) es una coleccin 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.
Las operaciones bsicas de una pila son push (empujar, meter) y pop (sacar)
o Push: aade 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 (estVacia): verifica si la pila est vaca
o EstaLLena (estLlena): 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 botn de retroceso), simplemente se extrae
la ltima direccin (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 operacin 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.
Ejemplo 1
Escriba un programa que permita implementar una pila de datos enteros.
ESPECIFICACIN DEL TAD Y LOS ALGORITMOS
Especificacion PILA
variable
entero: e
PILA: sgte
Entero: tope
Entero: i
operaciones
CREAR(TAMANO) : no retorna valor
OCUPADO : retorna valor logico
VACIO
: retorna valor logico
METER(dato) : no retorna ningun valor
SACAR() : retorna un tipo entero
VER()
: no retorna ningun valor
significado
CREAR permite crear un nodo
CREAR(TAMANO) permite crear la pila asignando un tamao.
OCUPADO retorna verdadero si la pila llego al tope de su tamao, en caso contrario retorna falso
VACIA retorna verdadero si la pila esta vacia, en caso contrario retorna falso.
METER( dato) procedimiento que ingresa el valor de dato a la pila.
SACAR() retorna el elemento que se saco de la cima de la pila.
VER() permite visualizar los datos de la pila
finPILA
if (i>=tope)
return true;
else return false;
}
bool VACIO(){
if(i<=0) return true;
else return false;
}
void METER(int dato){
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++;
}
int SACAR(){
int temp;
PILA *q;
q=raiz->sgte;
temp=raiz->e;
delete raiz;
raiz=q;
i--;
return temp;
}
void VER(){
PILA *q=raiz;
cout<<"\n";
while(q!=NULL){
cout<<" "<<q->e;
q=q->sgte;
}
}
};
int main(){
char op;
int dato;
PILA p(5),aux(5);
for(;;){
p.VER();
cout<<"\n Poner <1>\n Quitar <2>\n Salir <3>";
op=getch();
switch(op){
case '1':
if(!p.OCUPADO()){
cout<<"\n ingrese numero: ";cin>>dato;
p.METER(dato);
cout<<"se ingreso correctamente";
}
else cout<<"la pila esta llena";
break;
case '2': if(!p.VACIO()) {
p.SACAR();
cout<<"se retiro correctamente";
}
else cout<<"\n La pila esta vacia";
break;
Colas
Definicin
Una cola es una estructura de datos de acceso restrictivo a sus elementos. Un ejemplo sencillo es la cola
del cine o del autobs, el primero que llegue ser el primero en entrar, y afortunadamente en un sistema
informtico no se cuela nadie salvo que el programador lo diga.
Las colas sern 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 implementacin de las colas suele encapsularse, es decir,
basta con conocer las operaciones de manipulacin de la cola para poder usarla, olvidando su
implementacin interna
Las operaciones bsicas de una cola son enqueue (meter) y dequeue (sacar)
o enqueue: aade un nuevo elemento a final de la cola
o dequeue: elimina (saca) el primer elemento de la cola
Otras operaciones usualmente incluidas en el tipo abstracto COLA son:
o EstaVacia (estVacia): verifica si la cola est vaca
o EstaLLenal (estLlena): verifica si la cola est llena
Aplicaciones de colas
Meter
Sacar
EstaOcupada
EstaVacia
Ejemplo 2
Escriba un programa que permita implementar una cola de datos enteros.
ESPECIFICACIN DEL TAD Y LOS ALGORITMOS
Especificacion COLA
variable
entero: e
COLA: sgte
entero:tope
entero: i
operaciones
CREAR
: no retorna valor
CREAR(TAMANO) : no retorna valor
OCUPADO() : retorna valor logico
VACIO
: retorna valor logico
METER(dato) : no retorna ningun valor
SACAR() : retorna un tipo entero
VER()
: no retorna ningun valor
significado
CREAR permite crear un nodo
CREAR(TAMANO) permite crear la cola asignando un tamao.
OCUPADO retorna verdadero si la cola llego al tope de su tamao, en caso contrario retorna falso
VACIO retorna verdadero si la cola esta vacia, en caso contrario retorna falso.
class COLA{
int e;
COLA *sgte,*raiz;
int tope;
int i;
public:
COLA(){}
COLA(int TAMANO){
tope=TAMANO;
raiz=NULL;
i=0;
}
bool OCUPADO(){
if (i>=tope)
return true;
else return false;
}
bool VACIO(){
if(i<=0) return true;
else return false;
}
void METER(int dato){
COLA *q;
COLA *n=new COLA;
n->e=dato;
if (raiz == NULL) raiz = n;
else {
q=raiz;
while(q->sgte!=NULL) q=q->sgte;
q->sgte=n;
}
n->sgte=NULL;
i++;
}
int SACAR(){
int temp;
COLA *q;
q=raiz->sgte;
temp=raiz->e;
delete raiz;
raiz=q;
i--;
return temp;
}
void VER(){
COLA *q=raiz;
cout<<"\n";
while(q!=NULL){
cout<<" "<<q->e;
q=q->sgte;
}
}
};
int main(){
char op;
int dato;
COLA p(5);
for(;;){
p.VER();
cout<<"\n Poner <1>\n Quitar <2>\n Salir <3>";
op=getch();
switch(op){
case '1': if(!p.OCUPADO()){
cout<<"\n ingrese numero: ";cin>>dato;
p.METER(dato);
cout<<"se ingreso correctamente";
}
else cout<<"la cola esta llena";
break;
case '2': if(!p.VACIO()) {
p.SACAR();
cout<<"se retiro correctamente";
}
else cout<<"\n La cola esta vacia";
break;
case '3': return 0;
}
}
}
VENTAJAS Y DESVENTAJAS DE LAS LISTAS ENLAZADAS
La ventajas o desventajas se dan en funcion de la estructura con la cual son implementadas.
3.
4.
PROCEDIMIENTO
Ejercicio 1
Una pila con capacidad para 10 nmeros enteros como mximo, 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:
Operacin incorrecta, habilitada solo para nmeros que no estn en la cima
En este caso el nmero no se retira de la pila. Pero si el nmero no se encuentra en la cima de la pila debe
primero retirarse los nmeros encima del nmero que se quiere retirar para poder retirar recin el nmero
indicado y luego deben retornar a la pila los nmeros que estaban encima del nmero que se fue. Por
ejemplo:
Pila principal
20
15
15
11
12
pila principal
12
20
20
cima
15
12
fondo
cima
fondo
PILA : raiz
entero: tope
entero: i
operaciones
CREAR
: no retorna valor
CREAR(TAMANO) : no retorna valor
OCUPADO : retorna valor logico
VACIO()
: retorna valor logico
METER(dato) : no retorna ningun valor
SACAR() : retorna tipo entero
VER()
: no retorna ningun valor
ExtraerElemento(aux, prin, dato): retorna valor lgico
significado
CREAR permite crear un nodo
CREAR(TAMANO) permite crear la pila asignando un tamao.
OCUPADO retorna verdadero si la pila llego al tope de su tamao, en caso contrario retorna falso
VACIO retorna verdadero si la pila esta vacia, en caso contrario retorna falso.
METER(dato) procedimiento que ingresa un valor a la pila.
SACAR() retira un elemento de la cima de la pila.
VER() permite visualizar los datos de la pila
ExtraerElemento(aux, prin, dato) retorna un valor de verdad si la extraccin de un elemento fue
correcta, de lo contrario devuelve falso. La funcion para operar necesita como entrada dos pilas y la
informacin del dato a extraer.
finPILA
funcion ExtraerElemento(aux, prin, dato): logico
PILA : aux, prin
Entero: t,k,j, valor
Logico: SALIR
SALIRfalso
si(!prin.VACIO()) entonces
valorprin.SACAR()
si(dato=valor) entonces
prin.METER(dato);
return false;
sino
SALIRverdadero
aux.METER(valor)
mientras( no prin.VACIO() y SALIR) hacer
valorprin.SACAR()
si(valor dato) entonces
aux.METER(valor)
sino
SALIRfalso
finsi
finmientras
si( no SALIR) entonces
aux.VER()
prin.VER()
mientras(!aux.VACIO()) hacer
prin.METER(aux.SACAR())
finmientras
aux.VER();
prin.VER();
retornar verdadero
sino
retornar falso
finsi
finsi
sino
retornar falso
finsi
finExtraerElemento
IMPLEMENTACIN DEL TAD
#include "iostream.h"
#include "conio.h"
class PILA{
int e;
PILA *sgte,*raiz;
int tope;
int i;
public:
PILA(){}
PILA(int TAMANO){
tope=TAMANO;
raiz=NULL;
i=0;
}
bool OCUPADO(){
if (i>=tope)
return true;
else return false;
}
bool VACIO(){
if(i<=0) return true;
else return false;
}
void METER(int dato){
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++;
}
int SACAR(){
int temp;
PILA *q;
q=raiz->sgte;
temp=raiz->e;
delete raiz;
raiz=q;
i--;
return temp;
}
void VER(){
PILA *q=raiz;
cout<<"\n";
while(q!=NULL){
cout<<" "<<q->e;
q=q->sgte;
}
}
bool ExtraerElemento(PILA &aux, PILA &prin, int dato){
int t,k,j;
int valor;
bool SALIR=false;
if(!prin.VACIO()){
valor=prin.SACAR();
if(dato==valor){
prin.METER(dato);
return false;
}
else { SALIR=true;
aux.METER(valor);
while(!prin.VACIO() && SALIR){
valor=prin.SACAR();
if(valor!=dato)
aux.METER(valor);
else SALIR=false;
}
if(!SALIR){
aux.VER();
prin.VER();
while(!aux.VACIO())
prin.METER(aux.SACAR());
aux.VER();
prin.VER();
return true;
}
else return false;
}
}
else return false;
}
};
switch(op){
case '1':
if(!p.OCUPADO()){
cout<<"\n ingrese numero: ";cin>>dato;
p.METER(dato);
cout<<"se ingreso correctamente";
}
else cout<<"la pila esta llena";
break;
case '2': if(!p.VACIO()) {
p.SACAR();
cout<<"se retiro correctamente";
}
else cout<<"\n La pila esta vacia";
break;
case '3': cout<<"\n ingrese numero: ";cin>>dato;
if (!p.VACIO()){
if(p.ExtraerElemento(aux,p, dato))
cout<<"\n se retiro correctamente ";
else cout<<"\n no se pudo retirar";
}
else cout<<"\n la pila esta vacia";
break;
case '4': p.VER();break;
case '5': return 0;
}
}
}
Ejercicio 2
Cree Ud el algoritmo y el programa en C de una pila que permita guardar palabras. Ud elige el tamao de la
pila. La pila debe controlar que no se sobrepase el tope si intenta ingresar una palabra que sobrepase el
tamao de la pila o que no se intente sacar una palabra cuando la pila este vaca. Puede usar arreglos o
listas dinmicas para implementar la estructura.
Por ejemplo
Para una pila de tamao 10, puede ingresar la palabra UNO, luego CUANDO pero si intenta
ingresar la palabra TRES no podr porque sobrepasa el tamao. Si aplica la operacin sacar la
palabra inmediata a salir ser CUANDO
FONDO
CIMA
Ejercicio 3
Escriba un programa en C que implemente una pila con las siguientes caractersticas. 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 tamao mximo de 5 caracteres. Observe un ejemplo de una
secuencia de posibles operaciones.
vaca
push
333
3
push
333
no podr ya
que supera
la pila
push
22
pop
pop
push
22
push
22
Observacin:
La pila debe implementar las operaciones bsicas y emitir mensajes de error cuando se produzca algo
incorrecto
La implementacin puede ser hecha con arreglos o listas enlazadas dinmicamente.
Ejercicio 4
Se desea crear el algoritmo y el programa que permita crear una cola basado en dos pilas
Cuando queremos ingresar los datos(enteros), se ingresaran a la pila A
Cuando queremos realizar la extraccin de un elemento, vaciamos el contenido de la pila A a la pila B, de
manera que el primer elemento que se encuentra en el fondo de la pila A ser el ultimo elemento de la pila
B, de esta forma extraemos de la pila B el elemento que esta en la cima, el cual es el primer elemento que
se ingreso en A, cumpliendo as con la poltica de las pilas(ultimo en entrar, primero en salir), finalmente
volvemos a vaciar el contenido de la pila B a la pila A.
Por ejemplo
Suponemos que hemos ingresado algunos datos a la pila y cuando sacamos un valor realizamos tres pasos
pila A
9
10
5
8
pila A
pila B
pila A
pila B
8
5
10
9
Paso 1
5
10
9
Paso 2
pila A
pila B
9
10
5
Paso 3
Ejercicio 5
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:
5.
ANALISIS DE RESULTADOS
6.
BIBLIOGRAFIA