Pilas, Colas y Arboles

July 22, 2022 | Author: Anonymous | Category: N/A
Share Embed Donate


Short Description

Download Pilas, Colas y Arboles...

Description

 

1. UNIDAD 3: PILAS Definición, especificaciones y tipo de pilas implementadas con arreglos a rreglos y punteros. Una pila (stack  stack en en inglés inglés)) es una lista ordinal o estructura estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out , último en entrar , primero en salir ) que permite almacenar y recuperar datos. Para el manejo de los datos se cuenta con dos operaciones básicas: apilar ( push),  push), que coloca un objeto en la pila, y su operación inversa, retirar  (o desapilar, pop desapilar,  pop), ), que retira el último elemento apilado. En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último objeto apilado (denominado TOS, Top of Stack  en inglés). La operación perm rmitite e la ob obte tenc nció ión n de este este elem elemen ento to,, qu que e es re retitira rado do de la pila pila retirar  pe permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS. Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobre una pila de platos, y una operación retirar a retirarlo. Las pilas suelen emplearse en los siguientes contextos: • • •

Evaluación de expresiones en notación postfija (notación polaca inversa inversa). ). Reconocedores sintácticos de lenguajes independientes del contexto Implementación de recursividad. recursividad.

Operaciones Una pila cuenta con 2 operaciones imprescindibles: apilar y desapilar , a las que en las implementaciones modernas de las pilas se suelen añadir más de uso habitual. • • • • •

Crear: se crea la pila vacía. (constructor) Tamaño: regresa el número de elementos de la pila. (size) Apilar: se añade un elemento a la pila.(push) Desapilar: se elimina el elemento frontal de la pila.(pop) Cima: devuelve el elemento que esta en la cima de la pila. (top o peek) 1

 



Vacía: devuelve cierto si la pila está vacía o falso en caso contrario (empty).

Implementación • • • • •

Implementación en C++ Implementación en Python Implementación en Java Implementación en Visual Basic Implementación en Maude

Para resumir realizaremos la Implementación en Python y en C++ 

Implementación en C++ #ifndef PILA #define PILA // define la pila   template class Pila {  private: struct Nodo { T elemento; Nodo* siguiente; // coloca el nodo en la segunda posicion }* ultimo; unsigned int elementos;   public: Pila() { elementos = 0; }   ~Pila() { while (elementos != 0) pop(); }   void push(const T& elem) Nodo* aux = new Nodo;{ aux->elemento = elem; aux->siguiente = ultimo; ultimo = aux; ++elementos; }   void pop() { Nodo* aux = ultimo; ultimo = ultimo->siguiente; delete aux; --elementos; }   T cima() const { return ultimo->elemento;   }

2

 

bool vacia() const { return elementos == 0; }   unsigned int altura() const { return elementos; }   };  #endif  #endif 

Implementación en Python class Stack(object): def __init__(self): self.stack_pointer = None   def push(self, element): self.stack_pointer = Node(element, self.stack_pointer)   def pop(self): e = self.stack_pointer.element self.stack_pointer = self.stack_pointer.next return e   def peek(self): return self.stack_pointer.element   def __len__(self): i=0 sp = self.stack_pointer  while sp: i += 1 sp = sp.next return i   class Node(object): def __init__(self, element=None, next=None): self.element = element self.next = next   if __name__ '__main__': # small use==example s = Stack() for i in range(10):s.push(i) for i in range(len(s)):print(s.pop())

2. UNIDAD 4: COLAS Definición, especificaciones y Tipo de colas implementadas con arreglos. Una cola (también llamada fila) es una estructura de datos, datos, caracterizada caracterizada por ser  una secuencia de elementos en la que la operación de inserción  push se realiz realiza a 3

 

por un extremo y la operación de extracción  pop por el otro. También se le llama estructura FIFO (del inglés First In First Out ), ), debido a que el primer elemento en entrar será también el primero en salir. Tipos de colas •













Colas circulares (anillos): (anillos): en las que el último elemento y el primero están unidos. Colas de prioridad : En ellas, los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen. Hay 2 formas de implementación:  Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad. Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola. Bicolas:: son colas en donde los nodos se pueden añadir y quitar por  Bicolas ambos extremos; se les llama DEQUE (Double Ended QUEue). Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos. Hay variantes: Bicolass de entrad Bicola entrada a restrin restringida gida:: Son aquellas donde la inserción sólo se hace por el final, aunque podemos eliminar al inicio ó al final . Bicolas de salida restringida: restringida : Son aquellas donde sólo se elimina por el final, aunque se puede insertar al inicio y al final 

Operaciones Básicas • •





Crear : se crea la cola vacía. Encolar (añadir, entrar, insertar): se añade un elemento a la cola. Se añade al final de esta. Desencolar (sacar, salir, eliminar): se elimina el elemento frontal de la cola, es decir, el primer elemento que entró. Frente (consultar, front): se devuelve el elemento frontal de la cola, es decir, el primer elemento que entró.

Implementación • • • • •

Implementación en C++ Implementación en Python Implementación en Java Implementación en Visual Basic Implementación en Maude

Colas en C++ #ifndef COLA

4

 

#define COLA // Define la cola template class Cola{ private: struct Nodo{ T elemento; struct Nodo* siguiente; // coloca el nodo en la la segunda posición }* primero; struct Nodo* ultimo; unsigned int elementos; public: Cola(){ elementos = 0; } ~Cola(){ while (elementos != 0) pop(); } void push(const T& elem){ Nodo* aux = new Nodo; aux->elemento = elem; if (elementos == 0) primero = aux; else ultimo->siguiente = aux; ultimo = aux; ++elementos; } void pop(){ Nodo* aux = primero; primero = primero->siguiente; delete aux; --elementos; } T consultar() const{ return primero->elemento; } bool vacia() const{ return elementos == 0; } unsigned int size() const{ return elementos; } }; #endif 

5

 

3. UNIDAD 5: ÁRBOLES

Árboles Generales y binarios.  Árboles Generales. Un árbol general ( a veces es llamado árbol ) se define como un conjunto, finito no vació T de elementos, llamados nodos, tales que: 1. T cont contiene iene u un n elem elemento ento di disting stinguido uido R, llamad llamado o raíz d de e T. 2. Los rest restantes antes el element ementos os de T for forman man una ccolecci olección ón ordena ordenada da de cero o mas árboles disjuntos T1, T2,.., Tm..

 Árboles Binarios Un árbol binario es un árbol en el que cada nodo no puede tener mas de dos hijos o descendientes. Es un conjunto finito de nodos, el cual puede ser vacío o un conjunto que consta de un nodo raíz enlazado a dos árboles binarios disjuntos denominados subárbol izquierdo y subárbol derecho.

6

 

Estructura y representación de un árbol binario. Representación de los Árboles Generales como Binarios Los pasos que se deben aplicar para lograr la conversión del árbol general a binario son los siguientes: o

o

o

Deben Debe n enla enlaza zars rse e los los hijo hijoss de cada cada no nodo do en form forma a ho hori rizo zont ntal al (l (los os hermanos). Debe De be en enla laza zars rse e en form forma a vert vertic ical al el nodo nodo pa padr dre e con con el hijo hijo que que se encuentra más a la izquierda. Debe rotarse el diagra diagrama ma result resultante, ante, aproxima aproximadament damente e 45 grados hacia la izquierda y así se obtendrá el árbol binario correspondiente.

Conversión de un árbol general en un árbol binario. (a) Árbol general. (b) Árbol binario luego de aplicar pasos 1 y 2. (c) Árbol binario luego de aplicar el paso 3.

Todo árbol binario obtenido a partir de un árbol general, debe cumplir lo siguiente: o

En la rama derecha de cada nodo, excepto el nodo raíz, si ésta es distinta de vacío se encuentra un nodo que era hermano de éste en el árbol general. 7

 

o

En la rama izquierda de cada nodo (si ésta es distinta de vacío), se encuentra un nodo que era hijo de éste en el árbol generado.

Representación de árboles binarios en memoria Existen dos formas tradicionales de representar un árbol binario en memoria. • •

Por medio de listas enlazadas, variables dinámicas. Por medio de arreglos.

Representación de árboles binarios en memoria  por medio de listas listas enlazadas enlazadas. Los nodos del árbol binario serán representados como registros, que contendrán como mínimo tres campos. En un campo se almac almacenará enará la infor información mación del nodo. Los dos restantes se utilizarán para apuntar los subárboles izquierdo y derecho respectivamente del nodo en cuestión. Dado el siguiente nodo T:

Donde: IZQ: campo donde se almacena la dirección del subárbol izquierdo del nodo T. INFO: campo donde se almacena la información de interés del nodo. DER: campo donde se almacena la dirección del subárbol derecho del nodo La definición de un árbol binario en lenguaje algorítmico es como sigue: • • • • •

Enlace = ˆ nodo Nodo = registro IZQ: tipo enlace INFO: tipo dato DER: tipo enlace

{Fin de la definición}

8

 

Representación de Árboles binarios en memoria  por medio de arreglos. arreglos.

Para calc Para calcul ular ar el nú núme mero ro de elem elemen ento toss de un ár árbo boll es: es: 2 n-1. n = nivel de profundidad.

Árboles de expresión. Los árbol Los árboles es bi binar narios ios se ut utililiza izan n pa para ra re repre presen senta tar  r  expresiones en mem memori oria, a, esencialmente en compiladores de lenguajes de programación. Construcción de árboles de expresión Los paréntesis no se almacenan en el árbol pero están implicados en la forma del árbol. Si se supone que todos los operadores tienen dos operandos, se puede representar una expresión por un árbol binario cuya raíz contiene un operador y cuyyos subárbo cu rboles izquierdo y dere reccho son los operan and dos izq. y der. respectivamente. 9

 

Cada operando puede ser una letra o una subexpresión representada como un subárbol. Todos los operandos letras se almacenan en nodos.

Ejemplo 1: Dada la expresión (X+Y) * (A-B) construir el árbol de expresión.

Recorrido de un árbol. Recorridos en árboles binarios Recorrer un árbol binario significa visitar los nodos del árbol en forma sistemática, de tal manera que todos los nodos del mismo sean visitados una sola vez. Existen tres formas diferentes de efectuar Existen efectuar el recorri recorrido do (todos de forma recursi recursiva) va) los cuales son: • • •

Recorrido Recorrido en en Preorden Inorden Recorrido en Posorden

Recorrido en Preorden 1. Visit Visitar ar raí raízz (esc (escribir ribir la informa información ción del nodo). 2. Rec Recorre orrerr el subá subárbol rbol iizqu zquier ierdo do en pre preorde orden. n. 3. Rec Recorre orrerr el sub subárbo árboll dere derecho cho en p preor reorden. den.

10

 

 Algoritmo: Preorden (nodo) Si nodo S Nil entonces { Visitar el nodo (escribir nodo_Info) Regresar a Preorden con (nodo_Izq) Regresar a Preorden con (nodo_der) } Fin.

El valor en cada nodo es procesado conforme se pasa por cada nodo. Después de que se procese el valor de un nodo dado, son procesados los valores del subárbol izquierdo y a continuación los valores en el subárbol derecho. Recorrido en Inorden 1. Rec Recorre orrerr el sub subárbo árboll izq izquie uierdo rdo en Inord Inorden en 2. Vis Visita itarr raíz (proc (procesar esar e ell val valor or en el n nodo odo). ). 3. Rec Recorre orrerr el su subárb bárbol ol de derech recho o en Inorde Inorden n

 Algoritmo:

11

 

Inorden (nodo) Si nodo S Nil entonces { Regresar a Inorden (nodo_Izq) Visitar el nodo (escribir nodo_Info) Regresar a Inorden con (nodo_der) } Fin.

El valor en un nodo no es procesa procesado do en tanto no sean procesados los valores de su subárbol izquierdo. Recorrido en Posorden 1. Rec Recorre orrerr el subá subárbol rbol iizqu zquier ierdo do en Pos Posorde orden n 2. Rec Recorre orrerr el sub subárbo árboll dere derecho cho en P Posor osorden den 3. Vis Visita itarr raíz (proc (procesar esar e ell val valor or en el n nodo odo). ).

 Algoritmo: Posorden (nodo) Si nodo S Nil entonces { Regresar a Posorden (nodo_Izq) Regresar a Posorden con (nodo_der) Visitar el nodo (escribir nodo_Info) } Fin. El valor en cada nodo no se imprime hasta que son impresos los valores de sus hijos.

Árboles binarios de búsqueda: operaciones Un árbol binario de búsqueda (que no tiene los valores duplicados de nodos) titien enen en la ca cara ract cterí eríst stica ica qu que e los val valor ores es en cua cualq lqui uier er su subár bárbo boll iz izqu quie ierdo rdo so son n menores que el valor en sus nodos padres y los valores en cualquier subárbol derecho son mayores que el valor en sus nodos padres.

12

 

Recorrido del árbol  Preorden: 47 25 11 7 17 43 31 44 77 65 68 93 Inorden: 7 11 17 25 31 43 44 47 65 68 77 93 Posorden: 7 17 11 31 44 43 25 68 65 93 77 47 Creación de un árbol binario de búsqueda Supongamos que se desea almacenar los números: 8 3 1 20 10 5 4 en un árbol binario de búsqueda. Siguiendo la regla, dado un nodo en el árbol todos los datos a su izquierda deben ser menores que todos los datos del nodo actual, mientras que qu e to todo doss los da dato toss a ala ala de dere rech cha a de deba ban n se serr ma mayo yores res,, qu que e dicho dichoss da dato tos. s. Inicialmente el árbol esta vacío y se le debe insertar el 8.

 A continuación viene el 3. Ya que 3 es menor que 8, el 3 debe ir en el subárbol izquierdo.

A continuación se ha de insertar 1 que es menor que 8 y que 3; por lo tanto irá a la izquierda y debajo de 3.

13

 

Cada nuevo elemento se inserta como una hoja del árbol. Los restantes elementos se  pueden situar fácilmente.

Una propiedad de los árboles binarios de búsqueda es que no son únicos para los datos dados.

14

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF