Vous êtes sur la page 1sur 11

PILAS Y COLAS

1.1. PILAS (LIFO)


Una pila es un tipo especial de lista en la que todas
las inserciones y supresiones se realizan solamente
por uno de los extremos, el cual ser llamado cima o
parte superior.
A continuacin se presenta el esquema grfico de una
pila:
D
C
B
A

Cima (parte superior)

En la figura, el elemento D ha sido el ltimo en


entrar a la pila. Si ahora quisiramos suprimir un
elemento de la pila, ste debe ser D. Esto justifica
el nombre de Lista lifo (last in, first out = ltimo
en entrar, primero en salir) para una pila.
Las pilas se utilizan en gran cantidad en software de
sistemas, incluyendo compiladores e intrpretes.

1.1.1. OPERACIONES BSICAS


P.ANULA()

Funcin que convierte a la pila P en la pila vaca.


Funcin que retorna el elemento de la parte
P.CIMA()
superior de la pila P.
Funcin que inserta al elemento x en la parte
P.APILA(x)
superior de la pila P, cuya posicin viene a ser la
nueva cima de la pila.
Funcin que suprime al elemento superior de la
P.DESAPILA()
pila P.

1.1.2. IMPLEMENTACIN DE PILAS CON REFERENCIAS


La implementacin de pilas con referencias,
se basa en la siguiente figura:

NULL

Cima Fin
(Inicio)
// Utiliza la clase Leer y la clase NodoError que
// deben estar almacenadas en la misma carpeta
class pila {
int info;
pila sig;
pila inicio;
pila fin;
pila(){
inicio = fin = sig = null;
}
public void anula(){
inicio = fin = null;
}
public void apila(int x) throws NodoError
{
pila nuevo;
nuevo = new pila();
if(nuevo==null)
throw new NodoError("Error de asignacion");
else{
nuevo.info = x;
// Pone al principio de la pila
if(inicio!=null) nuevo.sig = inicio;
inicio = nuevo;
if(fin==null) fin = inicio;
}
}
public void desapila() throws NodoError
{
if(inicio==null)
throw new NodoError("Pila vaca");
else // Quitar del principio de la pila
inicio = inicio.sig;
}
public int cima() throws NodoError
{
if (inicio==null)
throw new NodoError("Pila vaca");
else
return (inicio.info);
}
public void contenido(){
pila p;
System.out.println("impresin de la pila");
p=inicio;
while(p!=null){
System.out.println(p.info);
p=p.sig;
}
System.out.println();

}
}

La Clase DemoPila utiliza la clase pila, la


excepcin
ErrorNodo
y
muestra
sus
operaciones:
public class DemoPila{
public static void main(String []args) throws NodoError
{
pila P=new pila();
int x=0,pos=0,sw,opcion;
sw=1;
do{
System.out.println("\n\n\n\nProcesamiento de una
Pila\n");
System.out.println("0. Salir");
System.out.println("1. Anula pila");
System.out.println("2. Apila");
System.out.println("3. Contenido de la pila");
System.out.println("4. Desapila");
System.out.println("5. Cima");
System.out.print("Opcion ==> ");
opcion=Leer.datoInt();
switch(opcion){
case 0: sw=0;break;
case 1: P.anula();break;
case 2: System.out.print("Valor a insertar ==>");
x=Leer.datoInt();
P.apila(x);
break;
case 3: P.contenido();break;
case 4:
try{
P.desapila();
}
catch(NodoError e){
System.out.println(e.getMessage());
}
finally{
break;
}
case 5:
try{
x=P.cima();
System.out.print("Valor de la cima es: "+x);
}
catch(NodoError e){
System.out.println(e.getMessage());
}
finally{
break;
}
}
}while(sw==1);
}
}

La clase NodoError (excepcin) se crea como


una clase derivada de la clase Exception, de
la siguiente manera:
public class NodoError extends Exception{
public NodoError(){}
public NodoError(String mensaje){
super(mensaje);

}
}

1.2. COLAS (FIFO)


Una cola es otro tipo especial de lista, en la cual
los elementos se insertan por un extremo llamado FINAL
y se suprime por el otro llamado FRENTE:

a, b, c, d, e

Frente

Fin

Esto ocasiona que el primer elemento en entrar es el


primero en salir; de aqu el nombre de lista fifo
(first in, first out) que tambin se le da a una cola.

1.2.1. OPERACIONES
Las operaciones bsicas que caracterizan a una cola
son las siguientes:

Funcin que convierte a la cola C en cola


vaca.
Funcin que retorna el 1er. elemento de la
C.FRENTE()
cola C. Esta funcin no est definida si la
cola es vaca.
Funcin que inserta al elemento x en el
C.INSERTA_COLA(x)
final de C.
Funcin que suprime el elemento del
C.SUPRIME_COLA() frente de la cola C. No se realiza si la cola
es vaca.
C.ANULA()

1.2.2. IMPLEMENTACIN DE COLAS CON REFERENCIAS


La implementacin de colas con referencias,
se basa en la siguiente figura:

NULL

Frente Fin
(Inicio)
// Utiliza la clase Leer y la clase NodoError que
// deben estar almacenadas en la misma carpeta

public class cola {


int info;
cola sig;
cola inicio;
cola fin;
cola(){
inicio = fin = sig = null;
}
public void anula(){
inicio = fin=null;;
}
public void inserta_cola(int x) throws NodoError
{
cola nuevo;
nuevo = new cola();
if(nuevo==null)
throw new NodoError("Error de asignacin");
else{
nuevo.info = x;
// Poner al final de la cola
if(fin!=null) fin.sig = nuevo;
fin = nuevo;
nuevo.sig = null;
if(inicio==null) inicio = fin;
}
}
public void suprime_cola() throws NodoError
{
if(inicio==null)
throw new NodoError("Cola vaca");
else // Quitar del principio de la cola
inicio = inicio.sig;
}
public int frente() throws NodoError
{
if (inicio==null)
throw new NodoError("Cola vaca");
else return (inicio.info);
}
public void contenido(){
cola p;
System.out.println("impresin de la cola");
p=inicio;
while(p!=null){
System.out.print(p.info+"-->");
p=p.sig;
}
System.out.println("null");
}
}

La Clase DemoCola utiliza la clase cola, la


clase NodoError y muestra sus operaciones:
public class DemoCola{
public static void main(String []args) throws NodoError
{
cola C=new cola();
int x=0,pos=0,sw,opcion;

sw=1;
do{
System.out.println("\n\n\n\nProcesamiento de una
cola\n");
System.out.println("0. Salir");
System.out.println("1. Anula cola");
System.out.println("2. Inserta cola");
System.out.println("3. Contenido de la cola");
System.out.println("4. Suprime cola");
System.out.println("5. Frente");
System.out.print("Opcion ==> ");
opcion=Leer.datoInt();
switch(opcion){
case 0: sw=0;break;
case 1: C.anula();break;
case 2: System.out.print("Valor a insertar ==>");
x=Leer.datoInt();
C.inserta_cola(x);
break;
case 3: C.contenido();break;
case 4:
try{
C.suprime_cola();
}
catch(NodoError e){
System.out.println(e.getMessage());
}
finally{
break;
}
case 5:
try{
x=C.frente();
System.out.println("Valor del frente es:
"+x);
}
catch(NodoError e){
System.out.println(e.getMessage());
}
finally{
break;
}
}
}while(sw==1);
}
}

La clase NodoError (excepcin) se crea como


una clase derivada de la clase Exception, de
la siguiente manera:
public class NodoError extends Exception{
public NodoError(){}
public NodoError(String mensaje){
super(mensaje);
}
}

1.3. PROGRAMAS EJEMPLO


PROGRAMA EJEMPLO UNO
El siguiente programa almacena datos de la cola de
clientes en un banco. La funcin leer_datos almacena
en los datos de la cola del banco, para lo cual
utiliza la funcin inserta_cola, los datos que se

almacenan son: el nombre del cliente, su tiempo de


atencin en ventanilla, su tiempo de espera en la
cola. Con la funcin calcular_prom_ta_may_te se
calcula el tiempo promedio de atencin, el mayor
tiempo de espera.
// Utiliza la clase Leer y la clase NodoError que
// deben estar almacenadas en la misma carpeta
public class ColaPromedio{
String nom;
float tia; //Tiempo de atencin
float tie; //Tiempo de espera
ColaPromedio sig;
ColaPromedio inicio;
ColaPromedio fin;
ColaPromedio(){
nom="";
tia=tie=0;
inicio=fin=sig=null;
}
public void anula(){
inicio=fin=null;
}
8
public void inserta_cola(String n,float ta,float te) throws NodoError
{
ColaPromedio nuevo;
nuevo = new ColaPromedio();
if(nuevo==null)
throw new NodoError("Error de asignacion");
else{
nuevo.nom=n;
nuevo.tia=ta;
nuevo.tie=te;
// Poner al final de la cola
if(fin!=null) fin.sig = nuevo;
fin = nuevo;
nuevo.sig = null;
if(inicio==null) inicio = fin;
}
}
public void contenido(){
ColaPromedio p;
System.out.println("\n\nImpresin de la cola");
p=inicio;
while(p!=null){
System.out.print(p.nom+" "+p.tia+" "+p.tie+" --> ");
p=p.sig;
}
System.out.println("null");
}
public void leer_datos(){
String n;
float ta,te;
while (true) {
System.out.print("Nombre (* para finalizar) ==> ");
n=Leer.datoString();
if(n.equals("*")) break;
System.out.print("Tiempo de atencion ==> ");

ta=Leer.datoFloat();
System.out.print("Tiempo de espera ==> ");
te=Leer.datoFloat();
try {
inserta_cola(n,ta,te);
}
catch (NodoError e){}
}
}
public void calcular_prom_ta_may_te(){
ColaPromedio p;
float mayte=-1,sumata=0.0f;
int cant=0; //cantidad de elementos
System.out.println("\n\nImpresion calculos");
p=inicio;
while(p!=null){
sumata+=p.tia;
if (p.tie>mayte) mayte=p.tie;
cant++;
p=p.sig;
}
System.out.println("Promedio de tiempo de atencion "+
sumata/cant);
System.out.println("Mayor tiempo de espera "+mayte);
}
public static void main(String []args){
ColaPromedio C=new ColaPromedio();
C.leer_datos();
C.contenido();
C.calcular_prom_ta_may_te();
}
}

PROGRAMA EJEMPLO DOS


Programa que evala el mbito de una expresin
limitado por: (, ), [, ], { y }. El programa verifica
que cada mbito comience con un delimitador de
apertura y termine con su correspondiente limitador de
cierre.
Para el programa se usa una pila para registrar los
delimitadores. Cuando se encuentra un smbolo para
abrir un mbito, se agrega a la pila. Cuando se
encuentra un smbolo para cerrar un mbito, se examina
la pila. Si est vaca, el signo no tiene el smbolo
correspondiente para abrir y, por tanto, la cadena no
es vlida. Sin embargo, si la pila no est vaca,
removemos el elemento de la pila y verificamos si el
elemento removido corresponde al smbolo para cerrar
el
mbito.
Si
coinciden,
proseguimos.
En
caso
contrario, la cadena no es vlida. Cuando se llega al
fin de la cadena, la pila debe estar vaca; de otra
forma, se han abierto uno o ms mbitos que no se han
cerrado y la cadena no es vlida.

// Utiliza la clase Leer y la clase NodoError que


// deben estar almacenadas en la misma carpeta
public class pila {
char info;
pila sig;
pila inicio;
pila fin;
pila(){
inicio=fin=sig=null;
}
public void anula(){
inicio=fin=null;
}
public void apila(char x) throws NodoError
{
pila nuevo;
nuevo = new pila();
if(nuevo==null)
throw new NodoError("Error de asignacion");
else{
nuevo.info=x;
// Pone al principio de la pila
if(inicio!=null) nuevo.sig=inicio;
inicio=nuevo;
if(fin==null) fin=inicio;
}
}
public void desapila() throws NodoError
{
if(inicio==null)
throw new NodoError("Pila vaca");
else // Quitar del principio de la pila
inicio=inicio.sig;
}
public char cima() throws NodoError
{
if (inicio==null)
throw new NodoError("Pila vaca");
else return (inicio.info);
}
public void contenido(){
pila p;
System.out.println("impresin de la pila");
p=inicio;
while(p!=null){
System.out.println(p.info);
p=p.sig;
}
System.out.println();
}
public void evalua_exp(String expresion){
int i=0;
boolean valid;
char car,car1,car2;
car=car1=car2='\0';
valid=true;
anula();
while(expresion.length()>i && valid){
car=expresion.charAt(i);

if (car=='(' ||
car=='[' ||
car=='{')
try {
apila(car);
}
catch (NodoError e){
System.err.println(e.getMessage());
}
if (car==')' ||
car==']' ||
car=='}')
if(inicio==null)
valid=false;
else {
switch(car){
case ')':
car1='(';break;
case ']':
car1='[';break;
case '}':
car1='{';break;
}
try{
car2=cima();
desapila();
if(car1!=car2) valid=false;
}
catch (NodoError e){
valid=false;
}
}
i++;
}
if(inicio!=null)
valid=false;
if (valid)
System.out.println("\nExpresion valida");
else
System.out.println("\nExpresion invalida");
}
}

La Clase EvaluaExpr utiliza la clase pila y analiza


una expresin:
public class EvaluaExpr{
public static void main(String []args){
pila P=new pila();
String expresion;
System.out.print("Expresion : ");
expresion=Leer.datoString();
P.evalua_exp(expresion);
}
}

PROGRAMA EJEMPLO TRES


Modificacin del programa anterior, donde la lectura
de la expresin se hace del archivo de texto.txt. Slo
se ha modificado la clase EvaluaExpr a:
import java.io.*;
public class EvaluaExpr{
public static void main(String []args){
pila P=new pila();

String expresion;
FileReader archivo;
BufferedReader archivoIn = null;
try{
archivo=new FileReader("test.txt");
archivoIn=new BufferedReader(archivo);
while((expresion=archivoIn.readLine())!=null){
System.out.println("\n\n\nExpresion : "+expresion);
P.evalua_exp(expresion);
}
}
catch(IOException e){
System.out.println(e);
}
finally{
try{
if(archivoIn!=null)
archivoIn.close();
}
catch(IOException e){
}
}
}
}

Para ejecutar el programa antes debe crear el archivo


de texto test.txt en el mismo directorio de la clase.
La primera y la tercera son expresiones vlidas, la
segunda no.
{x+(y-[a+b])*c-[(d+e)]}/(h-(j-(k-[l-n])))
{x+(y-[a+b])*c-[(d+e]}/(h-(j-(k-[l-n])))
(4+5)*{-[(4+2)-3]*3+5}

Vous aimerez peut-être aussi