Algoritmos M2

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 5

Utilización de la estructura de datos pila

Eficiencia y eficacia:

Podemos definir a la eficacia como la capacidad de alcanzar un determinado objetivo y a la


eficiencia como la capacidad de alcanzar un objetivo utilizando la menor cantidad de recursos
posibles.

La estructura de datos pila:

Esta es una estructura lineal restrictiva de tipo LIFO (last in first out), esto indica que el último
elemento que ingresó a la pila debe ser el primero en salir.

Características:

 se pueden realizar inserciones de elementos siempre en primer lugar.


 se pueden realizar extracciones de elementos siempre en el primer lugar.

Implementación:

Una estructura de datos de tipo pila puede ser implementada a nivel de software en forma
estática o dinámica. Para una implementación estática, que define un tamaño al momento de
la creación de la estructura, utilizaremos un vector y para una implementación dinámica
utilizaremos una lista enlazada.

Una implementación estática con un vector genera un desperdicio de espacio en la memoria,


ya que, cuando se crea la pila, se reserva el espacio de memoria para toda la estructura,
aunque no esté ocupada. Por otra parte, su implementación es muy sencilla y se accede en un
tiempo constante a sus elementos. Una implementación dinámica de una pila con una lista
enlazada no desperdicia memoria, dado a que los elementos se agregarán en forma dinámica y,
por otra parte, como una pila solo accede al elemento tope o cima, al ser el mismo el primer
elemento de la lista, el acceso y la inserción serán eficientes.

Operaciones:

 Crear: Permite crear la pila vacía.


 Obtener tamaño: Retorna el tamaño de la pila.
 Leer tope: Lee el elemento que está en el tope de la pila sin eliminarlo.
 Vacia: Indica si la pila está vacía o no.

Solución de problemas utilizando pilas como estructura de datos:

Uno de los casos más usados en informática de una pila es el de querer verificar si una
determinada sentencia o instrucción está equilibrada en cuanto a número de paréntesis,
corchetes o llaves de apertura y cierre. Cuando se escribe código de programación si no existe
equilibrio entre signos de apertura y cierre ni siquiera debería procesarse la sentencia. Para dar
solución a este problema, vamos a utilizar una estructura de pila donde vamos a ir analizando
una sentencia para verificar si es equilibrada o no en símbolos de paréntesis, recorriendo todos
sus caracteres desde el inicio hasta el final. Iremos construyendo nuestra pila apilando un
símbolo cada vez que detectemos un símbolo de apertura y desapilando de ella cuando
detectemos un símbolo de cierre. También utilizaremos la clase Stack provista por Java y
confeccionaremos el método verificarParentesis (string cadena) que nos retornará un boolean,
indicando si dada una cadena, esta está equilibrada y correcta en paréntesis o no. Para hacerlo,
usaremos tres métodos propios de la clase pila:

 push (): apila un elemento.


 empty (): consulta si es vacía la pila.
 pop (): desapila un elemento.

El método verificarParentesis (string cadena) crea una pila vacía y recorre la cadena enviada
como parámetro. Además, ante un paréntesis de apertura lo apila. Por otra parte, ante un
paréntesis de cierre, si la pila tiene elementos, desapila uno de ellos y, si la pila está vacía, apila
el paréntesis de cierre y corta la ejecución del programa.

Utilización de la estructura de datos cola


Podemos definir a la estructura de datos cola como una estructura lineal restrictiva de tipo
FIFO (first in first out), esto indica que el primer elemento que ingresó a la cola debe ser el
primero en salir. Este proceso se llama proceso de extracción de una cola.

Características:

 se pueden realizar inserciones de elementos siempre en último lugar quedando el


elemento en el fondo de la cola.
 se pueden realizar extracciones de elementos siempre desde el primer lugar.

Implementaciones de una estructura de datos cola:

Idem implementación datos pila

Solución problemas:

Clases:

 Nodo: Clase que define a los nodos (elementos) de la cola.


 Cola: Clase que define la estructura de cola compuesta por nodos enlazados.

Utilización de la estructura de datos lista


La estructura de datos lista enlazada:

Una lista lineal simplemente enlazada es una estructura de datos dinámica compuesta por
nodos enlazados linealmente, es decir, cada nodo contiene datos y una referencia al siguiente
elemento de la lista. Podemos explicar una lista como un conjunto de elementos que se
enlazan uno con otro, donde ese enlace se denomina referencia. Cuando la lista se crea, estará
vacía y no contendrá ningún elemento, con lo cual la lista tendrá una referencia a un valor nulo
(null). Cuando se agrega un nodo a la lista (A), se crea el nodo con el valor determinado y se
modifican sus referencias. Cuando se agrega un nuevo nodo a la lista (B), se crea el nodo con el
valor determinado y se modifican sus referencias. Si la inserción se hace como primer
elemento de la lista, la referencia al elemento siguiente de B será A.

Listas enlazadas simples y dobles:

Podemos definir a las listas enlazadas simples como las que contienen una única referencia a
un elemento “siguiente”, es decir que cada nodo de la lista tendrá sus datos y una sola
referencia o puntero. Uno de los problemas que posee esta estructura es que no es factible
acceder a un elemento anterior. Una lista doblemente enlazada es una muy buena opción para
dar solución al problema planteado. En ella cada nodo, además del valor, consta de dos
referencias o punteros: uno al nodo siguiente y otro al nodo anterior. Además, por otra parte,
se mantienen siempre un puntero al primer elemento de la lista y otro al final, de forma de
poder recorrerla en ambos sentidos. Para resolver este problema empleando listas doblemente
enlazadas, utilizaremos las siguientes clases:

 Nodo
 Lista: clase que define la estructura de lista compuesta por nodos doblemente
enlazados.

Analizando el método agregarAlFinal (char valor), Si la lista está vacía, se agrega dicho
elemento y se actualizan las referencias de inicio y fin de la lista, pero, en caso contrario, el
nuevo elemento debe insertarse al final de la lista, lo que se hace con tres instrucciones
directas:

 la referencia al elemento anterior del nuevo elemento se setea con la referencia al


último elemento actual.
 la referencia al elemento siguiente del último elemento actual de la lista se setea con el
elemento ingresado.
 la referencia del último elemento de la lista se actualiza al elemento siguiente.

Utilización de la estructura de datos árbol


Los árboles pueden definirse de dos maneras: de forma recursiva o no recursiva. La definición
no recursiva es la técnica más directa, mientras que la formulación recursiva nos permitirá
escribir algoritmos simples para la manipulación de árboles.

Si analizamos un árbol de manera no recursiva, podemos definirlo como una estructura de


datos no lineal conformada por un conjunto finito, fijo o variable, de nodos y ramas. Las ramas
son aristas dirigidas que unen dos nodos. Características:

 Presencia de un nodo raíz del cual se desprenden el resto de los nodos.


 Todo nodo, a excepción del nodo raíz, está conectado a otro nodo por una rama. Uno
de ellos es el nodo padre y, el otro, el nodo hijo.
 Se puede llegar a cada nodo por un camino único. La longitud de dicho camino es la
cantidad de ramas que hay que recorrer hasta llegar al nodo.
 De cada nodo, descienden otros nodos del mismo tipo, a excepción de los últimos
nodos, los cuales no tienen descendencia y son nombrados como nodos hoja. Los
nodos que no son hoja se llaman nodos de bifurcación o nodos rama.
 Se considera tamaño o grado de un nodo a la cantidad de descendientes que tiene,
incluyéndose a sí mismo.

Si definimos a un árbol de manera recursiva, podemos decir que un árbol es un conjunto de


nodos y ramas tal que existe un nodo raíz y el resto de los nodos son un conjunto disjunto que
conforma subárboles de la raíz. De esta manera, se define a un árbol como un conjunto de
árboles. Al indicar que los nodos son un conjunto disjunto, se quiere significar que los nodos
que se desprenden de la raíz y que conforman el subárbol derecho no pertenecen a los nodos
del subárbol izquierdo.

Tipos de árboles y sus aplicaciones:


Se puede encontrar una clasificación de los árboles en función de la cantidad de hijos que
tenga. Así, se pueden encontrar árboles binarios, es decir, aquellos de los cuales descienden
hasta dos hijos de cada nodo. Con el mismo razonamiento, se puede tener árboles ternarios,
etc. Los árboles son estructuras muy útiles y muy usadas para ciertos problemas. En el ámbito
informático, se puede encontrar la organización del sistema de archivos y carpetas de los
sistemas operativos, donde, a través de él, se puede ver que existen directorios que están
compuestos por otros directorios o archivos. Unas de las principales características de los
árboles es que son muy eficientes en las búsquedas de información.

Implementación arboles binarios:

Se puede definir a los árboles binarios de dos maneras. Por un lado, se puede decir que son
árboles en los que sus nodos tienen hasta dos hijos o se puede conceptualizar a un árbol
binario como un conjunto finito, fijo o variable de nodos, donde el nodo raíz consta de dos sub-
árboles binarios. Según la definición recursiva de árboles, podemos definir un árbol binario
como un conjunto de nodos y ramas, en el que existe un nodo raíz y dos sub-árboles binarios
conectados a la raíz.

Existe un tipo de árbol binario particular, llamado árbol binario de búsqueda, que se caracteriza
por presentar una raíz que posee un valor mayor que el de su hijo izquierdo y menor o igual
que el de su hijo derecho. Esto nos permite afirmar que cualquier nodo del árbol ubicado del
lado izquierdo de este será menor que la raíz y, de la misma manera, cualquier nodo del árbol
ubicado del lado derecho de éste será mayor o igual. Si se tiene un árbol con estas
características, localizar un valor será una tarea mucho más sencilla, en comparación con otras
estructuras. En general, las operaciones que se pueden necesitar en un árbol de búsqueda
binaria son:

 Buscar un elemento.
 Agregar un nuevo elemento.
 Eliminar un elemento.
 Recorrer el árbol.

Código:

El método agregarValor (Integer valor) hace la comparación con el valor del nodo (inicialmente
con la raíz): si es menor y el subárbol izquierdo posee valores, se llama nuevamente al método,
pero en el subárbol izquierdo. En el caso de que el valor pasado como parámetro sea mayor al
del nodo, se procede de la misma forma, pero con el subárbol derecho. Luego se definen tres
métodos de impresión por pantalla de valores, que se encargan de recorrer el árbol en
profundidad de tres formas diferentes:

 imprimirInOrden(): el recorrido inorden se realiza transitando, en primer lugar, el hijo


izquierdo; luego, la raíz y, finalmente, el hijo derecho.
 imprimirPreOrden(): el recorrido preorden se realiza transitando, primero, por la raíz;
luego, su hijo izquierdo y, finalmente, su hijo derecho.
 imprimirPosOrden(): el recorrido postorden se realiza transitando, en primera
instancia, por los hijos y, finalmente, por la raíz.

El método buscarValor(Integer valor) es el encargado de realizar la búsqueda de un valor


dentro de la estructura de árbol, donde es similar al proceso de inserción, donde se va
recorriendo el árbol buscando el valor pasado por parámetro, donde si el valor es menor al
nodo se recorre el subárbol izquierdo y si es mayor se recorre el subárbol derecho hasta
encontrar el valor. En el caso que se llegue al final del árbol, se retorna que el valor no fue
encontrado.

También podría gustarte