Está en la página 1de 47

Sesin UNIVERSIDAD CATLICA DE SANTA MARIA P. P.

INGENIERA SISTEMAS LABORATORIO DE ALGORITMIA Y ESTRUCTURA DE DATOS I PILAS Y COLAS I OBJETIVOS Explicar la estructura dinmica Pila. Explicar la estructura dinmica Cola. Implementar el TAD Pila. Implementar el TAD cola. Utilizar los TADs pila y cola para resolver problemas. II TEMAS Pilas Colas Colas de prioridad III MARCO TERICO PILAS Una pila es un tipo especial

de lista, concretamente, es una lista LIFO (Last In First Out o ltimo en entrar, primero en salir).
Se denomina as porque el comportamiento de esta estructura de datos es similar al de un conjunto de elementos apilados unos sobre otros. Como no se conoce, a priori, el nmero de elementos que pueden estar en la pila, una implementacin adecuada para una pila ser una implementacin en la memoria dinmica. La estructura bsica de una pila es una lista enlazada, y la diferencia entre una pila y una lista enlazada reside en las operaciones; las operaciones aplicadas a una pila son un subconjunto de las operaciones aplicables a una lista, considerando que las inserciones y borrados tienen lugar siempre en la misma posicin, posicin que recibe el nombre de cima de la pila.

APILADOS

Mgter. Juan Pablo Apaza Condori

Tambin se puede definir como una estructura de datos de entrada ordenada por la CIMA Se puede introducir y eliminar en la CIMA. Entrada Ordenada: No significa que se puedan comparar con el operador < (menor que). LIFO: Last Input, First Output. Operaciones tpicas: Insertar(push), retirar (pop) | Agregar un nuevo elemento

P
CIMA

PUSH

Eliminar un elemento

POP

22

244

62

2
NIL

FONDO

Mgter. Juan Pablo Apaza Condori

OPERACIONES BSICAS DE LA PILA PUSH (X, P): introduce el elemento x en la cima de la pila p. POP (P): elimina de la pila p el elemento de la cima de la pila. TOPE (X, P): devuelve en x el elemento que est en la cima de la pila p. nicamente puede consultarse el valor del elemento que est en la cabeza de la pila. CREAPILA (P): crea la pila p. PILAVACIA (P): es una funcin que informa sobre el estado de la pila p est vaca y False en otro caso. APLICACIONES DE LAS PILAS Se utilizan en:

p: devuelve True si la pila

Programacin de sistemas (para registrar llamadas a subprogramas, y recuperar los datos anteriores, o recuperar los parmetros). Recuperacin de elementos en orden inverso al que fueron colocados (en un depsito, una pila de contenedores, sillas, etc. ). Convertir notacin infija a posfija o prefija. Implementacin de recursividad.

Compiladores (parsers: reconocedores sintcticos de los compiladores).

Mgter. Juan Pablo Apaza Condori

PUSH

PUSH: UCSM

P
CIMA FONDO

P
CIMA

P
CIMA

P
CIMA

CIMA

U
NIL PUSH:

FONDO

U
NIL PUSH:

FONDO

U
NIL PUSH:

FONDO

U
NIL PUSH: M

FONDO

NIL PILA VACIA

Mgter. Juan Pablo Apaza Condori

POP

POP: UCSM

CIMA

CIMA

CIMA

P
FONDO

CIMA

P
FONDO

U
NIL

FONDO

U
NIL POP: M

FONDO

U
NIL POP: S

U
NIL POP: C

CIMA

FONDO

NIL POP: U

PILA CON DATOS

PILA VACIA

Se puede implantar con

Arrays (estticos) o con Listas (dinmicas).

Se deben evitar los errores de acceso: UnderFlow: Sacar un elemento de una Pila Vaca OverFlow: Meter un elemento en una pila llena (no hay mas espacio esttico o para asignar)

Estudiaremos la Pila implementada con Listas enlazadas.

Mgter. Juan Pablo Apaza Condori

TAD PILA CON LISTAS SIMPLEMENTE ENLAZADAS VENTAJAS: No se desperdicia posiciones de memoria El tamao de la pila se ajusta exactamente a la cantidad de elementos. El OverFlow estar ligado a la capacidad de RAM y del direccionamiento del Sistema Operativo. DESVENTAJAS: Ms Lento por la gestin de memoria Mayor Complejidad Espacial: se necesita mas memoria por cada elemento de la pila para guardar el ptr PILAS CON LISTAS SIMPLEMENTE ENLAZADAS: DECLARACIN FORMAL

class nodo
{ public: {

nodo(int v,nodo *sig=NULL)


valor=v; siguiente=sig;

CIMA

} private:

};

int valor; nodo *siguiente; friend class pila; nodo *pnodo;

23

4
NIL

FONDO

typedef

class pila
{ public: { }

pila()
cima=NULL;

~pila(); void PUSH(int v); void POP(); bool PilaVacia() { return cima==NULL; } int* TOPE(); private: pnodo cima; };

Mgter. Juan Pablo Apaza Condori

PILAS CON LISTAS SIMPLEMENTE ENLAZADAS: INSERCIN Parmetros: Pila (P) , elemento (e) Procedimiento: 1. Crear el nodo con el elemento 2. Actualizar los apuntadores involucrados EJEMPLO Dada la siguiente pila con listas simplemente enlazadas, se desea se desea realizar la operacin PUSH con el valor de 10.

CIMA

23

4
NIL SOLUCIN

FONDO

1. Crear nuevo nodo

10

1. Crear nuevo

nodo

new nodo(10, cima);

Mgter. Juan Pablo Apaza Condori

2. Actualizar apuntadores del nuevo nodo

CIMA

10

2. Actualizar apuntadores del nuevo

nodo

23

cima== new nodo(10, cima);

4c
NIL

FONDO

void pila::PUSH(int v) { cima=new nodo(v,cima); }

Mgter. Juan Pablo Apaza Condori

PILAS CON LISTAS SIMPLEMENTE ENLAZADAS: ELIMINACIN Parmetros: Pila (P) , elemento (e) Procedimiento: 1. Actualizar los apuntadores involucrados 2. Liberar el espacio ocupado por el nodo EJEMPLO Dada la siguiente pila con listas simplemente enlazadas, se desea realizar la operacin POP

CIMA

23

55

4
NIL

FONDO

Mgter. Juan Pablo Apaza Condori

SOLUCIN 1. Actualizar apuntadores de los nodos

CIMA

23

1. Actualizar apuntadores de los

55

nodos

pnodo var; var=cima; if (cima!=NULL) { cima=cima->siguiente; delete var; }

4
NIL

FONDO

2. Liberar espacio ocupado por el nodo

CIMA

2. Liberar espacio ocupado por el

nodo

delete var;

23

55

4
NIL

FONDO

Mgter. Juan Pablo Apaza Condori

10

void pila::POP()
{ pnodo var; var=cima; if (cima!=NULL) { cima=cima->siguiente; delete var; } } EJEMPLO: PILAS CON LISTAS SIMPLEMENTE ENLAZADAS

Nodo.h
#ifndef PILA_DINAMICA #define PILA_DINAMICA
#include <iostream.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> class nodo { public: nodo(int v,nodo *sig=NULL) { valor=v; siguiente=sig; } private: int valor; nodo *siguiente; friend class pila; }; typedef nodo *pnodo; class pila { public: pila() { cima=NULL; } ~pila(); void PUSH(int v); void POP(); bool PilaVacia() { return cima==NULL; } EVITAR DEFINICIONES MULTIPLES
El problema de definir archivos de cabecera ms de una vez es que las definiciones que contiene se pueden repetir Se puede evitar fcilmente el problema de tener definiciones mltiples. En cada archivo de cabecera, se pueden utilizar las directivas del compilador ifndef, #define y #endif para poner un envoltorio alrededor de estas definiciones y protegerlas de compilaciones mltiples de archivos de cabecera.

Mgter. Juan Pablo Apaza Condori

11

int* TOPE(); private: pnodo cima; }; pila::~pila() { pnodo aux; while(cima) { aux=cima; cima=cima->siguiente; delete aux; } } void pila::PUSH(int v) { cima=new nodo(v,cima); } void pila::POP() { pnodo var; var=cima; if (cima!=NULL) { cima=cima->siguiente; delete var; } } int* pila::TOPE() { if (cima!=NULL) { return &(cima->valor); } else { return NULL; } }

#endif

Mgter. Juan Pablo Apaza Condori

12

Pila.cpp
#include "Nodo.h" //using namespace std;
int main (int argc, char *argv[]) { pila p; p.PUSH(10); p.PUSH(20); p.PUSH(30); p.PUSH(40); cout<<"Eliminando datos de la pila"<<endl<<endl; while(!p.PilaVacia()) { cout<<*(p.TOPE())<<endl; p.POP(); } cout<<endl<<endl; system("PAUSE"); } Presione F5 En cuanto a la utilidad los espacios con nombre nos ayudan a evitar problemas con identificadores en grandes proyectos. Nos permite, por ejemplo, que existan variables o funciones con el mismo nombre, declaradas en diferentes ficheros fuente, siempre y cuando se declaren en distintos espacios con nombre.

o haga clic en

Mgter. Juan Pablo Apaza Condori

13

IV ACTIVIDADES NOTACIN POLACA (POSTFIJA) Para evaluar la expresin aritmtica:

Segn la prioridad de los operadores y el uso de los parntesis, se sigue el indicado con las flechas. Para eliminar esta dificultad, se hace una traduccin de las expresiones aritmticas a notacin postfija, que se llama tambin notacin de cadena polaca (denominada as en honor del matemtico polaco Lukasiewicsz, quin la origin). Esta notacin tiene la ventaja de que las operaciones aparecen en el orden en que se efectan realmente la evaluacin. La idea bsica detrs de la notacin de cadenas polacas es que los operadores se escriben al final y no en medio de las expresiones. De manera que A + B se escribira como AB+. En esta forma, el operador + se considera como una orden para sumar los valores de las dos variables que lo preceden inmediatamente. Un ejemplo puede ser:

La clave de la traduccin de notacin infija a posfija es la

+ -, * /, ^.

prioridad de los operadores: ( ),

REGLAS BSICAS PARA CONVERTIR EXPRESIONES INFIJAS A POSTFIJAS: 1. Si el elemento es un ( se coloca directamente en la pila de operadores. 2. Si el elemento es un ), los operadores de la pila se transfieren uno a uno, al extremo derecho de la expresin postfija hasta llegar a un (. Este se saca pero no va a la salida. 3. Si el elemento localizado es una variable, se coloca inmediatamente en el extremo derecho de la expresin postfija que se est creando. 4 Si el elemento ledo es un operador y es de menor o igual precedencia que el operador en la pila, el operador de la pila se saca y va a la salida, continuando de esta manera hasta encontrar un ( o hasta que el operador de la pila sea de menor precedencia. Cuando esto ocurre, el operador en turno se apila. Si vemos cualquier otro (Todos los operadores mayores o iguales al mas recientemente ledo salen) ***

smbolo (+,*,(), entonces sacamos los elementos de la pila hasta encontrar uno de menor prioridad.

Mgter. Juan Pablo Apaza Condori

14

EJEMPLO Convertir la siguiente expresin infija a postfija

a * b c d

e
a ; como es un operador se lleva a la salida

SOLUCIN 1 El primer smbolo ledo es la

CIMA

Salida a

NIL

2 A continuacin se lee el operador desapila

*. Debido a que la pila esta vaca en este momento no se ningn operador y se apila *

CIMA

Salida a
FONDO

*
NIL

Mgter. Juan Pablo Apaza Condori

15

3 A continuacin se lee un (, y como todos los operadores tienen una precedencia inferior a la del parntesis izquierdo, es inmediatamente apilado en la pila. Luego se lee

b y se lleva a la salida.

CIMA

Salida ab

*
NIL

FONDO

4 el siguiente smbolo ledo es + . Aunque ( tiene una precedencia superior que la de este operador, no puede ser desapilado de la pila hasta que haya sido ledo un se desapila y el operador

+ es apilado.

). De este modo, nada

Despus de esto se lee c y se lleva a la salida.

CIMA

Salida abc

*
NIL

FONDO

Mgter. Juan Pablo Apaza Condori

16

5 A continuacin se lee ) , entonces todos los operadores de la pila son llevados a la salida hasta encontrar

CIMA

Salida abc
FONDO

*
NIL

6 A continuacin el smbolo ledo es el operador + y como es de menor precedencia que el operador en la pila, el operador de la pila se saca y va a la salida. Por lo que el operador

* es llevado a la salida y el operador ledo + es apilado.

CIMA

Salida abc *
FONDO

+
NIL

7 A continuacin se lee d (y se lleva a la salida) seguida por inferior a la de la divisin, el operador

/ es apilado.

/. Como + tiene una precedencia

CIMA

Salida abc *d

+
NIL

FONDO

Mgter. Juan Pablo Apaza Condori

17

e, que es llevado a la salida. Entonces los restantes operadores almacenados en la pila son desapilados y llevados a la salida como se muestra a continuacin.
8 El smbolo final es

CIMA

Salida abc *de /

NIL 9 La salida final es la expresin postfija correcta.

Salida abc *de /


rpta abc * de * f g *

PROPUESTOS

1 Convertir la siguiente expresin infija a postfija

a b * c (d * e f ) * g

2 Convertir la siguiente expresin infija a postfija

En infija

(b 2 4 * a * c) 2 2*a

((b^ 2 4 * a * c) 2) /( 2 * a )
En postfija

Mgter. Juan Pablo Apaza Condori

18

RECURSIVIDAD Una pila puede usarse para simular la recursividad. De hecho, la recursividad se basa en la utilizacin de la pila del sistema. Un lenguaje como Pascal, que permite la recursividad, gestiona la pila sin que el programador tenga que preocuparse de sta. Pero podra simularse la recursividad dejando al programador la tarea de definir la pila y gestionarla, tal y como lo hara el sistema con la pila interna. EJEMPLO Algoritmo para hallar el factorial de un nmero mediante

pilas

Factorial.cpp
#include "Nodo.h" //using namespace std; int main (int argc, char *argv[]) { pila *p; int N,v, factorial; p=new pila(); cout<<"Ingrese un numero para calcular el factorial: "; cin>>N; while(N>1) { N = N-1; } factorial=1; while(!p->PilaVacia()) {

p->PUSH(N);

v=*(p->TOPE()); factorial = factorial * (v); p->POP();

cout<<endl<<endl<<"Factorial : "<<factorial<<endl<<endl;

cout<<endl<<endl; system("PAUSE"); return 0; }

Mgter. Juan Pablo Apaza Condori

19

Presione F5

o haga clic en

PROPUESTOS Elaborar un programa mediante pilas que pernita calcular el serie de FIBONNACI. Ecuacin de recurrencia de la serie de FIBONNACI:

H 0 0, H1 1,

H n H n1 H n2 .

(Usando solo una pila)

0,1,1,2,3,5,8

Mgter. Juan Pablo Apaza Condori

20

APLICACIONES 1 Ingrese a la siguiente direccin http://www.cosc.canterbury.ac.nz/mukundan/dsal/StackAppl.html

Mgter. Juan Pablo Apaza Condori

21

2 Ingrese a la siguiente direccin http://www.faqs.org/docs/javap/c11/s3.html

Mgter. Juan Pablo Apaza Condori

22

3 Programa que convierte una expresin Infija a PostFija

InToPost,java
import java.io.IOException; public class InToPost { private Stack theStack; private String input; private String output = ""; public InToPost(String in) { input = in; int stackSize = input.length(); theStack = new Stack(stackSize); } public String doTrans() { for (int j = 0; j < input.length(); j++) { char ch = input.charAt(j); switch (ch) { case '+': case '-': gotOper(ch, 1); break; // (precedence 1) case '*': // it's * or / case '/': gotOper(ch, 2); // go pop operators break; // (precedence 2) case '^': gotOper(ch, 3); // go pop operators break; // (precedence 2) case '(': // it's a left paren theStack.push(ch); // push it break; case ')': // it's a right paren gotParen(ch); // go pop operators break; default: // must be an operand output = output + ch; // write it to output break; } } while (!theStack.isEmpty()) { output = output + theStack.pop(); } System.out.println(output); return output; // return postfix } public void gotOper(char opThis, int prec1) { while (!theStack.isEmpty()) { char opTop = theStack.pop();
Mgter. Juan Pablo Apaza Condori

23

if (opTop == '(') { theStack.push(opTop); break; }// it's an operator else {// precedence of new op int prec2; if (opTop == '+' || opTop == '-') prec2 = 1; else prec2 = 2; if (prec2 < prec1) // if prec of new op less { // than prec of old theStack.push(opTop); // save newly-popped op break; } else // prec of new not less output = output + opTop; // than prec of old } } theStack.push(opThis); } public void gotParen(char ch){ while (!theStack.isEmpty()) { char chx = theStack.pop(); if (chx == '(') break; else output = output + chx; } } public static void main(String[] args) throws IOException { //String input = "1+2*4/5-7+3/6"; String input = "a+b*c+(d*e+f)*g"; String output; InToPost theTrans = new InToPost(input); output = theTrans.doTrans(); System.out.println("Postfix is " + output + '\n'); } class Stack { private int maxSize; private char[] stackArray; private int top; public Stack(int max) { maxSize = max; stackArray = new char[maxSize]; top = -1; } public void push(char j) { stackArray[++top] = j;
Mgter. Juan Pablo Apaza Condori

24

} public char pop() { return stackArray[top--]; } public char peek() { return stackArray[top]; } public boolean isEmpty() { return (top == -1); } } }

Mgter. Juan Pablo Apaza Condori

25

COLAS

Una cola es otro tipo especial de lista: es una primero en salir).

FIFO (First In, First Out, o primero en entrar,

Se denomina as porque el comportamiento de esta estructura de datos es similar a una

cola.

La implementacin idnea para una cola, por la misma razn que se ha visto para una pila, est basada en la memoria dinmica. La cola es un tipo especial de lista, aunque las operaciones sobre colas son ms restrictivas que las aplicables a las listas, ya que las inserciones tienen lugar al final de la cola y los borrados se realizan al principio de la cola. Estas dos operaciones, junto con la creacin y la consulta, son las operaciones habituales sobre colas.

Tambin se puede definir como una estructura de datos que almacena elementos en lista y que permite accederlos en su orden de aparicin.

FIFO: First Input, First Output.

Insertar: introduce elementos por el Final de la cola Quitar: saca elementos del Frente de la cola.
EJEMPLO

FINAL

FRENTE

25
DESENCOLAR

12

28

NIL

ENCOLAR

OPERACIONES BSICAS DE LA COLA CREACOLA (C): crea la cola c. COLAVACIA (C): funcin booleana que devuelve True si la cola est vaca. ENCOLAR (X, C): introduce x al final de la cola DESENCOLAR (C): elimina de la cola

c.

c el elemento que est al frente.

CABECERA (X, C): devuelve en x el elemento que est al frente de la cola c. Esta operacin no elimina al elemento x de la cola y la deja como estaba.
Mgter. Juan Pablo Apaza Condori

26

APLICACIONES DE LAS COLAS Se utilizan en: Las colas, al igual que las pilas, resultan de aplicacin habitual en muchos problemas informticos. Su utilizacin es infinita, desde la simulacin de una cola formada frente a un cajero automtico, hasta la cola de impresin. Quizs la aplicacin ms comn de las colas es la organizacin de tareas de un ordenador. Los procesos forman colas para la utilizacin de los recursos de un sistema computacional. Las colas tambin se utilizan en muchas partes del sistema operativo, como la asignacin de recursos de una computadora. En este caso, las distintas tareas de los usuarios deben esperar en una cola a que est disponible el recurso que necesitan. Colas de las tareas a realizar por una impresora en red. Colas de acceso al disco duro para leer o escribir datos.

Mgter. Juan Pablo Apaza Condori

27

ENCOLAR COLA VACIA

C C

FINAL

FRENTE

ENCOLAR: U

NIL

FINAL

FRENTE

U
ENCOLAR: C

NIL

FINAL

FRENTE

U
ENCOLAR: S

NIL

FINAL

FRENTE

U
ENCOLAR: M

NIL

FINAL

FRENTE

NIL

Mgter. Juan Pablo Apaza Condori

28

DESENCOLAR

COLA CON DATOS

FINAL

FRENTE

U
DESENCOLAR: U

M
FINAL

NIL

C
FRENTE

C
DESENCOLAR: C

M
FINAL

NIL

C
FRENTE

S
DESENCOLAR: S

NIL

C
FRENTE

FINAL

U
DESENCOLAR: U

NIL

FINAL

FRENTE

NIL

COLA VACIA

Mgter. Juan Pablo Apaza Condori

29

Se puede implantar con

Arrays (estticos) o con Listas (dinmicas).

Se deben evitar los errores de acceso: UnderFlow: Sacar un elemento de una Cola Vaca OverFlow: Meter un elemento en una Cola llena (no hay mas espacio esttico o para asignar)

Estudiaremos la Cola implementada con Listas enlazadas.


TAD COLA CON LISTAS SIMPLEMENTE ENLAZADAS VENTAJAS: No se desperdicia posiciones de memoria El tamao de la cola se ajusta exactamente a la cantidad de elementos. El OverFlow estar ligado a la capacidad de RAM y del direccionamiento del Sistema Operativo. DESVENTAJAS: Ms Lento por la gestin de memoria Mayor Complejidad Espacial: se necesita mas memoria por cada elemento de la guardar el ptr

cola para

Mgter. Juan Pablo Apaza Condori

30

COLAS CON LISTAS SIMPLEMENTE ENLAZADAS: DECLARACIN FORMAL

class nodo
{ public: {

nodo(int v,nodo *sig=NULL)


valor=v; siguiente=sig;

FINAL

FRENTE

} private:

NIL

};

int valor; nodo *siguiente; friend class cola; nodo *pnodo;

typedef

class cola
{ public: { }

cola()
frente=final=NULL;

void ENCOLAR(int v); void DESENCOLAR(); bool ColaVacia() { return frente==NULL; } int* CABECERA(); private:

~cola();

};

pnodo final; pnodo frente;

C
FRENTE

FINAL

NIL

Mgter. Juan Pablo Apaza Condori

31

COLAS CON LISTAS SIMPLEMENTE ENLAZADAS: ENCOLAR Parmetros: Cola (C) , elemento (e) Procedimiento: 3. Crear el nodo con el elemento 4. Actualizar los apuntadores involucrados EJEMPLO Dada la siguiente cola con listas simplemente enlazadas, se desea se desea realizar la operacin ENCOLAR con el valor de 10.

C
FRENTE

FINAL

6
SOLUCIN 1. Crear nuevo nodo

18

14

NIL

10

NIL

1. Crear nuevo

nodo

new nodo(10, NUll);

Mgter. Juan Pablo Apaza Condori

32

2. Actualizar apuntadores del nuevo nodo n=new nodo(v,NULL);


if(frente==NULL) { frente=n; } else { final->siguiente=n; } final=n; 2. Actualizar apuntadores del nuevo

C
FRENTE

nodo

FINAL

18

14

10

NIL

void cola::ENCOLAR(int v)
{ pnodo n; n=new nodo(v,NULL);
if(frente==NULL) { frente=n; } else { final->siguiente=n; } final=n;

Mgter. Juan Pablo Apaza Condori

33

COLAS CON LISTAS SIMPLEMENTE ENLAZADAS: DESENCOLAR Parmetros: Cola (C) , elemento (e) Procedimiento: 3. Actualizar los apuntadores involucrados 4. Liberar el espacio ocupado por el nodo EJEMPLO Dada la siguiente cola con listas simplemente enlazadas, se desea realizar la operacin DESENCOLAR

C
FRENTE

FINAL

6
SOLUCIN

18

14

NIL

1. Actualizar apuntadores de los nodos


1. Actualizar apuntadores de los pnodo var; if (frente!=NULL) { var=frente; frente=frente->siguiente; delete var; }

nodos

FINAL

FRENTE

18

14

NIL

Mgter. Juan Pablo Apaza Condori

34

2. Liberar espacio ocupado por el nodo

C
FRENTE

2. Liberar espacio ocupado por el

nodo

delete var;

FINAL

18

14

NIL

void cola::DESENCOLAR()
{
pnodo var; if (frente!=NULL) { var=frente; frente=frente->siguiente; delete var; }

Mgter. Juan Pablo Apaza Condori

35

EJEMPLO: COLAS CON LISTAS SIMPLEMENTE ENLAZADAS

Nodo.h
#ifndef COLA_DINAMICA #define COLA_DINAMICA
#include <iostream.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> class nodo { public: nodo(int v,nodo *sig=NULL) { valor=v; siguiente=sig; } private: int valor; nodo *siguiente; friend class cola; }; typedef nodo *pnodo; class cola { public: cola() { frente=final=NULL; } ~cola(); void ENCOLAR(int v); void DESENCOLAR(); bool ColaVacia() { return frente==NULL; } EVITAR DEFINICIONES MULTIPLES
El problema de definir archivos de cabecera ms de una vez es que las definiciones que contiene se pueden repetir Se puede evitar fcilmente el problema de tener definiciones mltiples. En cada archivo de cabecera, se pueden utilizar las directivas del compilador ifndef, #define y #endif para poner un envoltorio alrededor de estas definiciones y protegerlas de compilaciones mltiples de archivos de cabecera.

int* CABECERA();

private: pnodo frente; pnodo final; }; cola::~cola() { } void cola::ENCOLAR(int v)


Mgter. Juan Pablo Apaza Condori

36

{ pnodo n; n=new nodo(v,NULL); if(frente==NULL) { frente=n; } else { final->siguiente=n; } final=n; } void cola::DESENCOLAR() { pnodo var; if (frente!=NULL) { var=frente; frente=frente->siguiente; delete var; } } int* cola::CABECERA() { if (frente!=NULL) { return &(frente->valor); } else { return NULL; } }

#endif

Mgter. Juan Pablo Apaza Condori

37

Cola.cpp
#include "Nodo.h" //using namespace std;
int main (int argc, char *argv[]) { cola *c; c=new cola(); c->ENCOLAR(10); c->ENCOLAR(1); c->ENCOLAR(3); c-> ENCOLAR (12); c-> ENCOLAR (5); cout<<"Datos de la cola"<<endl<<endl; while(!c->ColaVacia()) { cout<<*(c->CABECERA())<<endl; c-> DESENCOLAR (); } cout<<endl<<endl; system("PAUSE"); return 0; } Presione F5 En cuanto a la utilidad los espacios con nombre nos ayudan a evitar problemas con identificadores en grandes proyectos. Nos permite, por ejemplo, que existan variables o funciones con el mismo nombre, declaradas en diferentes ficheros fuente, siempre y cuando se declaren en distintos espacios con nombre.

o haga clic en

PROPUESTOS Modifique el programa anterior para que permita almacenar nombres en vez de nmeros. c->ENCOLAR(Jose); c->ENCOLAR(Jorge); c->ENCOLAR(Luis);

Mgter. Juan Pablo Apaza Condori

38

APLICACIONES Ingrese a la siguiente direccin http://www.concentric.net/~ttwang/java/QueueDemo.html

Ingrese a la siguiente direccin: http://www.jthreadkit.com/demo/ObjectFIFO/objfifoapplet.html

Mgter. Juan Pablo Apaza Condori

39

Ingrese a la siguiente direccin http://www.cosc.canterbury.ac.nz/mukundan/dsal/QueueAppl.html

Mgter. Juan Pablo Apaza Condori

40

COLAS DE PRIORIDAD Una Cola de Prioridad es una coleccin de datos que tienen asociada cierta informacin (denominada prioridad) que determina el orden de acceso En una cola, por el contrario, se accede a los datos segn el orden en el que se incorporan a la cola Una cola de prioridad es una generalizacin de los conceptos de pila y cola en la que, tras entrar en la cola, la salida de los elementos no se basa necesariamente en el orden de llegada sino que se basa en un orden definido entre ellos. La extraccin de elementos de una cola de prioridad puede buscar minimizar o maximizar el valor del elemento saliente. La interpretaremos en el sentido de minimizar. Para maximizar tan solo hay que cambiar el sentido de las comparaciones. En el modelo bsico de una cola de prioridad la operaciones que consideramos son: Insertar en la cola, Obtener el elemento mnimo, y Eliminar el elemento mnimo. La realizacin de estas operaciones no requiere mantener ordenada (ni total ni parcialmente) la coleccin de elementos en la cola. APLICACIONES DE LAS COLAS Algunas aplicaciones importantes de las colas de prioridad: Gestin de procesos en un sistema operativo. Los procesos no se ejecutan uno tras otro en base a su orden de llegada. Algunos procesos deben tener prioridad (por su mayor importancia, por su menor duracin, etc.) sobre otros. Implementacin de algoritmos voraces, los cuales proporcionan soluciones globales a problemas basndose en decisiones tomadas slo con informacin local. La determinacin de la mejor opcin local suele basarse en una cola de prioridad. Algunos algoritmos sobre grafos, como la obtencin de caminos o arboles de expansin de mnimo coste, son ejemplos representativos de algoritmos voraces basados en colas de prioridad. Implementaciones eficientes de algoritmos de simulacin de sucesos discretos. En estas, el avance del tiempo no se gestiona incrementando un reloj unidad a unidad, sino incrementado sucesivamente el reloj al instante del siguiente suceso.

Mgter. Juan Pablo Apaza Condori

41

IMPLEMENTACIN MEDIANTE UNA NICA LISTA Cada proceso forma un nodo de la lista enlazada. La lista se mantiene ordenada pro el vcampo prioridad. La operacin de aadir un nuevo nodo hay que hacerla siguiendo este criterio: La posicin de insercin es tal que la nueva lista ha de permanecer ordenada. A igualdad de prioridad se aade como ltimo en el grupo de nodos de igual prioridad. De esta manera la lista queda organizada de tal forma que un nodo X precede a un nodo Y si: Prioridad de (X) > Prioridad de (Y) Ambos tienen la misma prioridad , pero X se aadi antes que Y.

C
FRENTE

DATO PRIORIDAD SIGUIENTE

FINAL

23

78

10

NIL

Los nmeros de prioridad tienen el significado habitual: a menor nmero mayor prioridad. Esta realizacin presenta como principal ventaja que es inmediato determinar el siguiente nodo a procesar: siempre ser el primero de la lista. Sin embargo, aadir un nuevo elemento supone encontrar la posicin de la insercin dentro de la lista, segn el criterio expuesto anteriormente.

Mgter. Juan Pablo Apaza Condori

42

APLICACIONES Ingrese la siguiente direccin URL http://www.akira.ruc.dk/~keld/algoritmik_e99/Applets/Chap11/PriorityQ/PriorityQ.html

Mgter. Juan Pablo Apaza Condori

43

COLA DE PRIORIDAD MEDIANTE UN MONTCULO BINARIO Para que una estructura sea un montculo binario debe cumplir dos propiedades: Un montculo es un rbol binario completamente lleno, con la posible excepcin del nivel ms bajo, el cual se rellena de izquierda a derecha. Estos rboles se denominan rboles binarios completos. Todo nodo debe ser menor que todos sus descendientes. Por lo tanto, el mnimo estar en la raz y su bsqueda y eliminacin se podr realizar rpidamente. Los rboles binarios completos son muy regulares, lo que permite que los montculos puedan ser representados mediante simples arrays sin necesidad de punteros. En una representacin con arrays los hijos de un elemento colocado en la posiciones 2i y 2i+1 ( hijo izquierdo e hijo derecho respectivamente), y el padre en la posicin E( i/2 ) (parte entera de i/2 ). EJEMPLO

posicin i estaran en las

En el rbol se puede apreciar claramente los hijos de B ( D y E) y su padre ( A). A travs de la representacin con un array se podra obtener la misma informacin: Nodo B en la posicin 2. Hijo izquierdo: posicin 2*2 = 4. Luego el hijo izquierdo es D. Hijo derecho: posicin 2*2+1 = 5. Luego el hijo derecho es E. Padre: posicin E( 2/2) = 1. Luego el padre es A.

Mgter. Juan Pablo Apaza Condori

44

Ingrese a http://www.cosc.canterbury.ac.nz/mukundan/dsal/MinHeapAppl.html

Mgter. Juan Pablo Apaza Condori

45

V EJERCICIOS 1 Convertir la siguiente expresin infija a postfija

b b2 4 * a * c 2*a
En infija

( b + ( b ^ 2 4 * a * c ) ^ (1 / 2 ) ) / ( 2 * a )
?

En postfija

2 Elabore un programa que permita convertir una expresin

infija en postfija.

3 Una librera registra las peticiones de cualquier libro que no tiene en ese momento. La informacin de cada libro consiste en el ttulo del libro, el precio (en SOLES), el nmero de libros en stock, y las peticiones del libro en estricto orden de llegada. Cada peticin consiste en el nombre de una persona y su direccin. a) Define los tipos de datos capaces de describir toda esta informacin para un total de 2000 libros. Justifica la eleccin de estructuras para las peticiones y para la estructura general que incluye los datos de todos los libros. b) Implementa una operacin que dado un cliente que pide un libro, vea si hay en stock, y si quedan, actualice el stock con la venta de ese libro, y si no, guarde los datos del cliente como ltima peticin de ese libro. c) Implementa otra operacin que dado un libro del que se reciben k ejemplares vea si hay peticiones y si las hay escriba en pantalla los k primeros clientes y elimine sus peticiones. Si hay ms de k peticiones el stock seguir a 0. Si hay menos de k peticiones, habr que actualizar el stock con los libros que queden. 4 Una agencia de viajes ofrece n destinos; para cada destino se puede optar por 5 clases de viaje, super, luxe, normal, turista y estudiante, y adems se ofrecen tres tipos de alojamiento: AD alojamiento y desayuno), MP (media pensin) y PC (pensin completa).

Mgter. Juan Pablo Apaza Condori

46

Cada programa de viaje se caracteriza por la informacin (destino, clase, alojamiento). Por cada programa de viaje se quiere saber el nmero de plazas disponibles, de manera que cuando un cliente contrata un determinado programa, el nmero de plazas disponibles se decrementa. Cuando un programa no dispone de plazas, entonces la informacin del cliente (nombre, direccin y NIF) se almacena en orden cronolgico. As, cuando se disponga de nuevas plazas en ese programa se atendern las peticiones en orden. Se desea informatizar la gestin de esta agencia. Entre otras cosas, es preciso: a)La definicin de la estructura de datos que soporte la informacin descrita (es decir, la estructura que permita almacenar todos los programas de viaje de la agencia). b)Escribir un algoritmo que, dado un cliente y un determinado programa de viajes, compruebe si es posible o no que el cliente lo contrate. En cualquier caso, habr que realizar las acciones oportunas para que la estructura se actualice de forma conveniente. c) Escribir un algoritmo que indique todos los destinos con alguna plaza disponible. La solucin debe incluir la definicin de la estructura de datos ms idnea para devolver la informacin, sabiendo que n < 100.

Mgter. Juan Pablo Apaza Condori

47

También podría gustarte