Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmia I 07
Algoritmia I 07
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
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
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:
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.
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
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 VACIA
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)
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: {
CIMA
} private:
};
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; };
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
10
1. Crear nuevo
nodo
CIMA
10
nodo
23
4c
NIL
FONDO
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
CIMA
23
55
nodos
4
NIL
FONDO
CIMA
nodo
delete var;
23
55
4
NIL
FONDO
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.
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
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
13
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:
+ -, * /, ^.
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.
14
a * b c d
e
a ; como es un operador se lleva a la salida
CIMA
Salida a
NIL
*. Debido a que la pila esta vaca en este momento no se ningn operador y se apila *
CIMA
Salida a
FONDO
*
NIL
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.
CIMA
Salida abc
*
NIL
FONDO
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
CIMA
Salida abc *
FONDO
+
NIL
/ es apilado.
CIMA
Salida abc *d
+
NIL
FONDO
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
PROPUESTOS
a b * c (d * e f ) * g
En infija
(b 2 4 * a * c) 2 2*a
((b^ 2 4 * a * c) 2) /( 2 * a )
En postfija
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);
cout<<endl<<endl<<"Factorial : "<<factorial<<endl<<endl;
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 .
0,1,1,2,3,5,8
20
21
22
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); } } }
25
COLAS
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.
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.
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.
27
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
28
DESENCOLAR
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
29
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)
cola para
30
class nodo
{ public: {
FINAL
FRENTE
} private:
NIL
};
typedef
class cola
{ public: { }
cola()
frente=final=NULL;
void ENCOLAR(int v); void DESENCOLAR(); bool ColaVacia() { return frente==NULL; } int* CABECERA(); private:
~cola();
};
C
FRENTE
FINAL
NIL
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
32
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;
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
nodos
FINAL
FRENTE
18
14
NIL
34
C
FRENTE
nodo
delete var;
FINAL
18
14
NIL
void cola::DESENCOLAR()
{
pnodo var; if (frente!=NULL) { var=frente; frente=frente->siguiente; delete var; }
35
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();
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
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);
38
39
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.
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
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.
42
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
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.
44
Ingrese a http://www.cosc.canterbury.ac.nz/mukundan/dsal/MinHeapAppl.html
45
b b2 4 * a * c 2*a
En infija
( b + ( b ^ 2 4 * a * c ) ^ (1 / 2 ) ) / ( 2 * a )
?
En postfija
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).
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.
47