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

} void pop() { Nodo* aux = ultimo. } T cima() const { return ultimo->elemento. // coloca el nodo en la segunda posicion }* ultimo. unsigned int elementos. Nodo* siguiente. } 2 . public: Pila() { elementos = 0. --elementos. ultimo = aux. ++elementos. aux->siguiente = ultimo. delete aux. ultimo = ultimo->siguiente.• Vacía: devuelve cierto si la pila está vacía o falso en caso contrario (empty). } ~Pila() { while (elementos != 0) pop(). 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. aux->elemento = elem. } void push(const T& elem) { Nodo* aux = new Nodo.

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

Hay 2 formas de implementación: • Añadir un campo a cada nodo con su prioridad. • Crear tantas colas como prioridades haya.por un extremo y la operación de extracción pop por el otro. • Bicolas: son colas en donde los nodos se pueden añadir y quitar por ambos extremos. Resulta conveniente mantener la cola ordenada por orden de prioridad. Se añade al final de esta. los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. debido a que el primer elemento en entrar será también el primero en salir. • Desencolar (sacar. aunque podemos eliminar al inicio ó al final. entrar. el primer elemento que entró. Hay variantes: • Bicolas de entrada restringida: Son aquellas donde la inserción sólo se hace por el final. se atenderán de modo convencional según la posición que ocupen. el primer elemento que entró. • Frente (consultar. eliminar): se elimina el elemento frontal de la cola. • Colas de prioridad: En ellas. es decir. es decir. • Encolar (añadir. se les llama DEQUE (Double Ended QUEue). Si varios elementos tienen la misma prioridad. salir. insertar): se añade un elemento a la cola. 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. Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos. • Bicolas de salida restringida: Son aquellas donde sólo se elimina por el final. También se le llama estructura FIFO (del inglés First In First Out). front): se devuelve el elemento frontal de la cola. Tipos de colas • Colas circulares (anillos): en las que el último elemento y el primero están unidos. 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 T> class Cola{ private: struct Nodo{ T elemento. public: Cola(){ elementos = 0. aux->elemento = elem. } ~Cola(){ while (elementos != 0) pop(). ultimo = aux. } bool vacia() const{ return elementos == 0. } void pop(){ Nodo* aux = primero. struct Nodo* ultimo. #endif 5 . else ultimo->siguiente = aux. struct Nodo* siguiente. } T consultar() const{ return primero->elemento. unsigned int elementos. } void push(const T& elem){ Nodo* aux = new Nodo. --elementos. // coloca el nodo en la segunda posición }* primero. if (elementos == 0) primero = aux. ++elementos. } unsigned int size() const{ return elementos. delete aux. } }. primero = primero->siguiente.

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

(a) Árbol general. 7 . Conversión de un árbol general en un árbol binario. o Debe enlazarse en forma vertical el nodo padre con el hijo que se encuentra más a la izquierda. (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.Estructura y representación de un árbol binario. (b) Árbol binario luego de aplicar pasos 1 y 2. si ésta es distinta de vacío se encuentra un nodo que era hermano de éste en el árbol general. o Debe rotarse el diagrama resultante. aproximadamente 45 grados hacia la izquierda y así se obtendrá el árbol binario correspondiente. 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.

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

esencialmente en compiladores de lenguajes de programación. Los árboles binarios se utilizan para representar expresiones en memoria.Representación de Árboles binarios en memoria por medio de arreglos. 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. 9 . Árboles de expresión. respectivamente. 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. Si se supone que todos los operadores tienen dos operandos. n = nivel de profundidad. y der.

10 . Ejemplo 1: Dada la expresión (X+Y) * (A-B) construir el árbol de expresión. Recorrer el subárbol izquierdo en preorden. Recorrido de un árbol. Recorrer el subárbol derecho en preorden. Todos los operandos letras se almacenan en nodos. 2. 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.Cada operando puede ser una letra o una subexpresión representada como un subárbol. Recorridos en árboles binarios Recorrer un árbol binario significa visitar los nodos del árbol en forma sistemática. 3. Visitar raíz (escribir la información del nodo). de tal manera que todos los nodos del mismo sean visitados una sola vez.

son procesados los valores del subárbol izquierdo y a continuación los valores en el subárbol derecho.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. 3. Recorrer el subárbol derecho en Inorden Algoritmo: 11 . Recorrido en Inorden 1. Visitar raíz (procesar el valor en el nodo). El valor en cada nodo es procesado conforme se pasa por cada nodo. Recorrer el subárbol izquierdo en Inorden 2. Después de que se procese el valor de un nodo dado.

El valor en cada nodo no se imprime hasta que son impresos los valores de sus hijos. Visitar raíz (procesar el valor en el nodo). Recorrer el subárbol derecho en Posorden 3. Recorrer el subárbol izquierdo en Posorden 2.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. Á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. Recorrido en Posorden 1. 12 . 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 un nodo no es procesado en tanto no sean procesados los valores de su subárbol izquierdo.

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. Inicialmente el árbol esta vacío y se le debe insertar el 8. que dichos datos. el 3 debe ir en el subárbol izquierdo. 13 . Siguiendo la regla. Ya que 3 es menor que 8. por lo tanto irá a la izquierda y debajo de 3. A continuación se ha de insertar 1 que es menor que 8 y que 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. A continuación viene el 3.

14 . Los restantes elementos se pueden situar fácilmente.Cada nuevo elemento se inserta como una hoja del árbol. Una propiedad de los árboles binarios de búsqueda es que no son únicos para los datos dados.

Sign up to vote on this title
UsefulNot useful