You are on page 1of 16

UNIVERSIDAD INCA GARCILASO DE LA VEGA

FACULTAD DE INGENIERIA DE SISTEMAS, COMPUTO Y TELECOMUNICACIONES

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.

Defina las tcnicas de conformacin y administracin de pilas y colas.


Identifique las aplicaciones de pilas y colas.
Conozca e implemente las operaciones que con las pilas y colas se pueden realizar.

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.

Manejo de la pila: UEPS (LIFO)

La insercin y extraccin de elementos de la pila siguen el principio LIFO (last-in-first-out).


El ltimo elemento en entrar es el nico accesible en cada momento.

Operaciones con pilas: Push, Pop

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.

Implementacin de pilas con arreglos

Una pila es una coleccin ordenada de objetos.


En C, los arreglos permiten almacenar colecciones ordenadas.
La desventaja de implementar una pila mediante un arreglo es que esta ltima es de tamao fijo,
mientras que la pila es de tamao dinmico.

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

funcion OCUPADO(): logico


si (i>=tope) entonces
retornar verdadero
Sino
retornar falso
finsi
finOcupada
funcion VACIO(): logico
si(i<=0) entonces
retornar verdadero
Sino
retornar falso
finsi
finVACIA
procedimiento METER dato): logico
crear(n)
asignar(n,dato)
si (raiz = nulo) entonces
raiz n
sgte(n)nulo
sino
sgte(n)raiz
raizn
finsi
ii+1
finMETER
funcion SACAR(): entero
qsgte(raiz)
leer(raiz, e)
liberar( raiz)
raizq
ii-1
retornar e;
finSACAR

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;
}
}
};

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;

case '3': return 0;


}
}

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

Manejo de la cola: PEPS(FIFO)

La insercin y extraccin de elementos de la cola siguen el principio FIFO (first-in-first-out).


El elemento con ms tiempo en la cola es el que puede ser extrado.

Operaciones con colas: Push, Pop

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

Implementacin de colas con arreglos

Una cola es una coleccin ordenada de objetos.


En C, los arreglos permiten almacenar colecciones ordenadas.
Misma desventaja: los arreglos tienen tamao fijo.
Uso eficiente mediante un arreglo circular.

Aplicaciones de colas

En general, operaciones en redes de computadoras


o Trabajos enviados a una impresora
o Solicitudes a un servidor.
Clientes solicitando ser atendidos por una telefonista
Simulaciones de cualquier situacin real en la que se presente una organizacin tipo cola.
Estas entidades corresponden a lo que en matemticas se conoce como lneas de espera, y su
estudio terico, conocido como teora de colas, es muy importante en transporte y telecomunicacin
(una modalidad de transporte).

PRIMITIVAS USADAS POR LAS PILAS Y 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.

METER(dato) procedimiento que ingresa un valor a la cola.


SACAR() saca un elemento de la cola.
VER() permite visualizar los datos de la cola
finCOLA
funcion OCUPADO(): logico
si (i>=tope) entonces
retornar verdadero
sino
retornar falso
finsi
finOcupada
funcion VACIO(): logico
si(i<=0) entonces
retornar verdadero
sino
retornar falso
finsi
finVACIA
funcion METER(dato): logico
crear(n)
asignar(n,dato)
si (raiz = nulo) entonces
raiz n
sino
qraiz
mientras (sgte(q) nulo ) hacer
qsgte(q)
finmientras
sgte(q)n
finsi
sgte(n)nulo
ii+1
finMETER
funcion SACAR(): entero
qsgte(raiz)
leer(raiz, e)
liberar( raiz)
raiz=q
ii-1
retornar e
finSACAR

IMPLEMENTACIN DEL TAD


#include "iostream.h"
#include "conio.h"

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.

REQUERIMIENTOS O MATERIAL Y EQUIPO

4.

Software Dev C++


1 Diskete

PROCEDIMIENTO

El procedimiento consiste en dos pasos

Especificacin del TAD


Implementacin del TAD

Ejercicio 1
Una pila con capacidad para 10 nmeros enteros como mximo, tiene las siguientes operaciones:

Retirar elemento (se retira de manera automtica)


Retirar elemento que no este en la cima de la pila
Poner elemento

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

Cada vez que su programa retire un


elemento como el valor 11 que no esta
en la cima de la pila, su programa debe
visualizar la siguiente informacin:
Pila auxiliar

15

11
12

pila principal

12

20

Presione <enter> para mostrar la pila actualizada

20

cima

15
12

fondo

Presione <enter> para continuar


NOTA
Implemente la pila en C usando asignacin dinamica

ESPECIFICACIN DEL TAD Y LOS ALGORITMOS


Especificacion PILA
variable
entero: e
PILA : sgte

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;
}
};

int main(int argc, char *argv[]){


char op;
int dato;
PILA p(5),aux(5);
for(;;){
cout<<"\n Poner <1>\n Quitar <2>\n Quitar2 <3>\n Ver <4>\n Salir <5>";
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;
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:

Escribir un programa en C que implemente la cola medieval, especificando tipo abstracto de


datos para las colas medievales que disponga de las operaciones bsicas de una cola (ingresar,
retirar, preguntar si esta vaca o llena). La implementacin puede ser hecha con arreglos o
listas enlazadas dinmicamente.
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 tamao
los que no alcanzan van a una cola de espera que tambien es una lista simple dinamica sin
limite de tamao. 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.
Ejercicio 7
Cree una pila de numeros, donde la condicion para meter un numero en la pila es que no pueden haber dos
numeros pares contiguos o dos numeros impares tambien contiguos.
Ejercicio 8
Usando aleatoriedad imite la cola en un banco, en el cual hay tres cajeros y una unica cola. Si en caso las
tres cajas estan vacias se comienza por la caja 1, luego la caja2 y finalmente por la caja3.

5.

ANALISIS DE RESULTADOS

6.

Son estructuras dinamicas


Se diferencian en la forma de ingresar los datos, mientras en la pila el ultimo dato que entra es el
primero que sale, en una cola el primero que entra es el primero que sale.
Tanto pilas y colas tienen cuatro operaciones basicas como meter(push), sacar(pop), preguntar si la
estructura esta llena y preguntar si la estructura esta vacia

BIBLIOGRAFIA

Estructura de Datos, Un Enfoque Algortmico. Manuel Gallardo O., Teodomiro Prez C.


Estructura de Datos en Pascal, AARON M. TENENBAUM, MOSHE J. AUGENSTEIN
Fundamentos de Programacin, Algoritmos y Estructura de Datos. LUIS JOYANES AGUILAR

You might also like