P. 1
Pilas, Colas y Arboles

Pilas, Colas y Arboles

|Views: 309|Likes:
Publicado porARTEAGAAP

More info:

Published by: ARTEAGAAP on May 24, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

08/21/2015

pdf

text

original

1. UNIDAD 3: PILAS Definición, especificaciones y tipo de pilas implementadas con arreglos y punteros.

Una pila (stack en inglés) es una lista ordinal o 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), que coloca un objeto en la pila, y su operación inversa, retirar (o 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 retirar permite la obtención de este elemento, que es retirado de la pila 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). Reconocedores sintácticos de lenguajes independientes del contexto Implementación de 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

public: Pila() { elementos = 0. aux->siguiente = ultimo. delete aux.• 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 T> class Pila { private: struct Nodo { T elemento. --elementos. aux->elemento = elem. unsigned int elementos. ultimo = ultimo->siguiente. ++elementos. } 2 . } void pop() { Nodo* aux = ultimo. // coloca el nodo en la segunda posicion }* ultimo. } void push(const T& elem) { Nodo* aux = new Nodo. } T cima() const { return ultimo->elemento. Nodo* siguiente. ultimo = aux. } ~Pila() { while (elementos != 0) pop().

} unsigned int altura() const { return elementos.stack_pointer) def pop(self): e = self. Una cola (también llamada fila) es una estructura de datos. #endif Implementación en Python class Stack(object): def __init__(self): self.element self.push(i) for i in range(len(s)):print(s.element = element self.pop()) 2. self. caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza 3 .next return e def peek(self): return self. } }.stack_pointer = Node(element.bool vacia() const { return elementos == 0. element): self.next return i class Node(object): def __init__(self.element def __len__(self): i=0 sp = self.stack_pointer = None def push(self.stack_pointer = self. UNIDAD 4: COLAS Definición.stack_pointer while sp: i += 1 sp = sp.stack_pointer.stack_pointer. next=None): self.stack_pointer. element=None.next = next if __name__ == '__main__': # small use example s = Stack() for i in range(10):s. especificaciones y Tipo de colas implementadas con arreglos.

salir. • Bicolas de salida restringida: Son aquellas donde sólo se elimina por el final. es decir. es decir. insertar): se añade un elemento a la cola. También se le llama estructura FIFO (del inglés First In First Out). se atenderán de modo convencional según la posición que ocupen. Resulta conveniente mantener la cola ordenada por orden de prioridad. Si varios elementos tienen la misma prioridad. • Colas de prioridad: En ellas. 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 . eliminar): se elimina el elemento frontal de la cola. aunque podemos eliminar al inicio ó al final. y almacenar cada elemento en su cola. aunque se puede insertar al inicio y al final Operaciones Básicas • Crear: se crea la cola vacía. Se añade al final de esta. Hay variantes: • Bicolas de entrada restringida: Son aquellas donde la inserción sólo se hace por el final. front): se devuelve el elemento frontal de la cola. Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos. se les llama DEQUE (Double Ended QUEue). Tipos de colas • Colas circulares (anillos): en las que el último elemento y el primero están unidos. debido a que el primer elemento en entrar será también el primero en salir. • Desencolar (sacar. • Bicolas: son colas en donde los nodos se pueden añadir y quitar por ambos extremos. • Crear tantas colas como prioridades haya. los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Hay 2 formas de implementación: • Añadir un campo a cada nodo con su prioridad. el primer elemento que entró. entrar. • Encolar (añadir. • Frente (consultar.por un extremo y la operación de extracción pop por el otro. el primer elemento que entró.

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

llamado raíz de T. Árboles Generales.. 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 .. Un árbol general ( a veces es llamado árbol ) se define como un conjunto. Es un conjunto finito de nodos. Tm. Los restantes elementos de T forman una colección ordenada de cero o mas árboles disjuntos T1. finito no vació T de elementos. T contiene un elemento distinguido R. tales que: 1. 2. UNIDAD 5: ÁRBOLES Árboles Generales y binarios. llamados nodos.3.. Árboles Binarios Un árbol binario es un árbol en el que cada nodo no puede tener mas de dos hijos o descendientes. T2..

o Debe rotarse el diagrama resultante. (c) Árbol binario luego de aplicar el paso 3. aproximadamente 45 grados hacia la izquierda y así se obtendrá el árbol binario correspondiente. (b) Árbol binario luego de aplicar pasos 1 y 2. debe cumplir lo siguiente: o En la rama derecha de cada nodo. Todo árbol binario obtenido a partir de un árbol general.Estructura y representación de un árbol binario. si ésta es distinta de vacío se encuentra un nodo que era hermano de éste en el árbol general. o Debe enlazarse en forma vertical el nodo padre con el hijo que se encuentra más a la izquierda. (a) Árbol general. 7 . 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 Deben enlazarse los hijos de cada nodo en forma horizontal (los hermanos). excepto el nodo raíz. Conversión de un árbol general en un árbol binario.

que contendrán como mínimo tres campos. se encuentra un nodo que era hijo de éste en el árbol generado. Los dos restantes se utilizarán para apuntar los subárboles izquierdo y derecho respectivamente del nodo en cuestión. • • Por medio de listas enlazadas. Representación de árboles binarios en memoria por medio de listas enlazadas. 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 . Por medio de arreglos. En un campo se almacenará la información del nodo. Representación de árboles binarios en memoria Existen dos formas tradicionales de representar un árbol binario en memoria. variables dinámicas.o En la rama izquierda de cada nodo (si ésta es distinta de vacío). Dado el siguiente nodo T: Donde: IZQ: campo donde se almacena la dirección del subárbol izquierdo del nodo T. Los nodos del árbol binario serán representados como registros.

y der. 9 .Representación de Árboles binarios en memoria por medio de arreglos. Para calcular el número de elementos de un árbol es: 2 n-1. se puede representar una expresión por un árbol binario cuya raíz contiene un operador y cuyos subárboles izquierdo y derecho son los operandos izq. Los árboles binarios se utilizan para representar expresiones en memoria. Si se supone que todos los operadores tienen dos operandos. esencialmente en compiladores de lenguajes de programación. respectivamente. n = nivel de profundidad. 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. Árboles de expresión.

Recorrer el subárbol izquierdo en preorden. Recorridos en árboles binarios Recorrer un árbol binario significa visitar los nodos del árbol en forma sistemática. Recorrido de un árbol. 10 . 2.Cada operando puede ser una letra o una subexpresión representada como un subárbol. Ejemplo 1: Dada la expresión (X+Y) * (A-B) construir el árbol de expresión. Existen tres formas diferentes de efectuar el recorrido (todos de forma recursiva) los cuales son: • • • Recorrido en Preorden Recorrido en Inorden Recorrido en Posorden Recorrido en Preorden 1. Visitar raíz (escribir la información del nodo). Recorrer el subárbol derecho en preorden. de tal manera que todos los nodos del mismo sean visitados una sola vez. Todos los operandos letras se almacenan en nodos. 3.

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. El valor en cada nodo es procesado conforme se pasa por cada nodo. 3. Recorrer el subárbol izquierdo en Inorden 2.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. Recorrido en Inorden 1. Visitar raíz (procesar el valor en el nodo). Recorrer el subárbol derecho en Inorden Algoritmo: 11 .

12 . El valor en un nodo no es procesado en tanto no sean procesados los valores de su subárbol izquierdo. Recorrido en Posorden 1. Visitar raíz (procesar el valor en el nodo).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 cada nodo no se imprime hasta que son impresos los valores de sus hijos. Recorrer el subárbol derecho en Posorden 3. Recorrer el subárbol izquierdo en Posorden 2. Árboles binarios de búsqueda: operaciones Un árbol binario de búsqueda (que no tiene los valores duplicados de nodos) tienen la característica que los valores en cualquier subárbol izquierdo son 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. 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.

A continuación viene el 3. mientras que todos los datos a ala derecha deban ser mayores. dado un nodo en el árbol todos los datos a su izquierda deben ser menores que todos los datos del nodo actual. A continuación se ha de insertar 1 que es menor que 8 y que 3. Siguiendo la regla. Ya que 3 es menor que 8. el 3 debe ir en el subárbol izquierdo. 13 . que dichos datos. por lo tanto irá a la izquierda y debajo de 3.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. Inicialmente el árbol esta vacío y se le debe insertar el 8.

Cada nuevo elemento se inserta como una hoja del árbol. 14 . 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.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->