Sie sind auf Seite 1von 10

Estructura de Datos

I
Ing. David Reinaldo Benavides Delcid

Tarea 3

Alumno:
Manuel Flores - 61611139

Fecha de entrega:
13/05/2018
¿Qué es una Pila?
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. Se aplica en multitud de ocasiones en informática debido a
su simplicidad y ordenación implícita en la propia estructura

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.

Pila de llamadas
La pila de llamadas es un segmento de memoria que utiliza esta estructura de datos para almacenar
información sobre las llamadas a subrutinas actualmente en ejecución en un programa en proceso.

Cada vez que una nueva subrutina es llamada, se apila una nueva entrada con información sobre
ésta tal como sus variables locales. En especial, se almacena aquí el punto de retorno al que regresar
cuando esta subrutina termine (para volver a la subrutina anterior y continuar su ejecución después
de esta llamada.
Pila como tipo abstracto de datos
La pila es un contenedor de nodos y tiene dos operaciones básicas: push (o apilar) y pop (o
Desapilar). 'Push' añade un nodo a la parte superior de la pila, dejando por debajo el resto de los
nodos. 'Pop' elimina y devuelve el actual nodo superior de la pila. Una metáfora que se utiliza con
frecuencia es la idea de una pila de platos en una cafetería con muelle de pila.

En esa serie, sólo la primera placa es visible y accesible para el usuario, todas las demás placas
permanecen ocultas.

Como se añaden las nuevas placas, cada nueva placa se convierte en la parte superior de la pila,
escondidos debajo de cada plato, empujando a la pila de placas. A medida que la placa superior se
elimina de la pila, la segunda placa se convierte en la parte superior de la pila.

Dos principios importantes son ilustrados por esta metáfora: En primer lugar la última salida es un
principio, la segunda es que el contenido de la pila está oculto. Sólo la placa de la parte superior es
visible, por lo que para ver lo que hay en la tercera placa, el primer y segundo platos tendrán que
ser retirados.

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.

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 está en la cima de la pila. (top o peek)

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

Implementación
Un requisito típico de almacenamiento de una pila de n elementos es O(n). El requisito típico de
tiempo de O(1) las operaciones también son fáciles de satisfacer con un array o con listas enlazadas
simples.

La biblioteca de plantillas de C++ estándar proporciona una "pila" clase templated que se limita a
sólo apilar/Desapilar operaciones. Java contiene una biblioteca de la clase Pila que es una
especialización de Vector. Esto podría ser considerado como un defecto, porque el diseño heredado
get () de Vector método LIFO ignora la limitación de la Pila.
Estos son ejemplos sencillos de una pila con las operaciones descritas anteriormente (pero no hay
comprobación de errores).

Arquitectura básica de una pila


Una pila típica es un área de la memoria de los computadores con un origen fijo y un tamaño
variable. Al principio, el tamaño de la pila es cero. Un puntero de pila, por lo general en forma de un
registro de hardware, apunta a la más reciente localización en la pila; cuando la pila tiene un tamaño
de cero, el puntero de pila de puntos en el origen de la pila.

Las dos operaciones aplicables a todas las pilas son:


Una operación apilar, en el que un elemento de datos se coloca en el lugar apuntado por el puntero
de pila, y la dirección en el puntero de pila se ajusta por el tamaño de los datos de partida.

Una operación Desapilar: un elemento de datos en la ubicación actual apuntado por el puntero de
pila es eliminado, y el puntero de pila se ajusta por el tamaño de los datos de partida.

Hay muchas variaciones en el principio básico de las operaciones de pila. Cada pila tiene un lugar
fijo en la memoria en la que comienza. Como los datos se añadirán a la pila, el puntero de pila es
desplazado para indicar el estado actual de la pila, que se expande lejos del origen (ya sea hacia
arriba o hacia abajo, dependiendo de la aplicación concreta).

Por ejemplo, una pila puede comenzar en una posición de la memoria de mil, y ampliar por debajo
de las direcciones, en cuyo caso, los nuevos datos se almacenan en lugares que van por debajo de
1000, y el puntero de pila se decrementa cada vez que un nuevo elemento se agrega. Cuando un
tema es eliminado de la pila, el puntero de pila se incrementa.

Los punteros de pila pueden apuntar al origen de una pila o de un número limitado de direcciones,
ya sea por encima o por debajo del origen (dependiendo de la dirección en que crece la pila), sin
embargo el puntero de pila no puede cruzar el origen de la pila. En otras palabras, si el origen de la
pila está en la dirección 1000 y la pila crece hacia abajo (hacia las direcciones 999, 998, y así
sucesivamente), el puntero de pila nunca debe ser incrementado más allá de 1000 (para 1001, 1002,
etc.) Si un desapilar operación en la pila hace que el puntero de pila se deje atrás el origen de la pila,
una pila se produce desbordamiento. Si una operación de apilar hace que el puntero de pila
incremente o decremente más allá del máximo de la pila, en una pila se produce desbordamiento.

La pila es visualizada ya sea creciente de abajo hacia arriba (como pilas del mundo real), o, con el
máximo elemento de la pila en una posición fija, o creciente, de izquierda a derecha, por lo que el
máximo elemento se convierte en el máximo a "la derecha". Esta visualización puede ser
independiente de la estructura real de la pila en la memoria. Esto significa que rotar a la derecha es
mover el primer elemento a la tercera posición, la segunda a la primera y la tercera a la segunda.
Cola
Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la
operación de inserción push se realiza 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.

Las colas se utilizan en sistemas informáticos, transportes y operaciones de investigación (entre


otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se
guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta
se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas.

Ejemplo de Cola
La particularidad de una estructura de datos de cola es el hecho de que sólo podemos acceder al
primer y al último elemento de la estructura. Así mismo, los elementos sólo se pueden eliminar por
el principio y sólo se pueden añadir por el final de la cola.

Ejemplos de colas en la vida real serían: personas comprando en un supermercado, esperando para
entrar a ver un partido de béisbol, esperando en el cine para ver una película, una pequeña
peluquería, etc. La idea esencial es que son todos líneas de espera.

En estos casos, el primer elemento de la lista realiza su función (pagar comida, pagar entrada para
el partido o para el cine) y deja la cola. Este movimiento está representado en la cola por la función
pop o desencolar. Cada vez que otro elemento se añade a la lista de espera se añaden al final de la
cola representando la función push o encolar. Hay otras funciones auxiliares para ver el tamaño de
la cola (size), para ver si está vacía en el caso de que no haya nadie esperando (empty) o para ver el
primer elemento de la cola (frente).

Teóricamente, la característica de las colas es que tienen una capacidad específica. Por muchos
elementos que contengan siempre se puede añadir un elemento más y en caso de estar vacía borrar
un elemento sería imposible hasta que no se añade un nuevo elemento. A la hora de añadir un
elemento podríamos darles una mayor importancia a unos elementos que a otros (un cargo VIP) y
para ello se crea un tipo de cola especial que es la cola de prioridad. (Ver cola de prioridad).

Operaciones Básicas
Crear: se crea la cola vacía.

Encolar (añadir, entrar, push): se añade un elemento a la cola. Se añade al final de esta.

Desencolar (sacar, salir, pop): 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 primero elemento
que entró.
Implementaciones
Colas en Maude

La ColaNV es la cola no vacía, que diferenciamos de la cola normal a la hora de tomar en cuenta
errores. A su vez, el elemento X representa el tipo de valor que puede contener la cola: entero,
carácter, registro.

Tipos de colas
Colas circulares (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:

1. Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola
ordenada por orden de prioridad.
2. 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 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:

Bicolas de entrada restringida: Son aquellas donde la inserción sólo se hace por el final, aunque
podemos eliminar al inicio ó al final.

Bicolas de salida restringida: Son aquellas donde sólo se elimina por el final, aunque se puede
insertar al inicio y al final.

Arboles
Un árbol es una estructura no lineal en la que cada nodo puede apuntar a uno o varios nodos.

También se suele dar una definición recursiva: un árbol es una estructura en compuesta por un dato
y varios árboles.

Esto son definiciones simples. Pero las características que implican no lo son tanto.

Los árboles con los que trabajaremos tienen otra característica importante: cada nodo sólo puede
ser apuntado por otro nodo, es decir, cada nodo sólo tendrá un padre. Esto hace que estos árboles
estén fuertemente jerarquizados, y es lo que en realidad les da la apariencia de árboles.

En cuanto a la posición dentro del árbol:


Nodo raíz: nodo que no tiene padre. Este es el nodo que usaremos para referirnos al árbol. En el
ejemplo, ese nodo es el 'A'.

Nodo hoja: nodo que no tiene hijos. En el ejemplo hay varios: 'F', 'H', 'I', 'K', 'L', 'M', 'N' y 'O'.

Nodo rama: aunque esta definición apenas la usaremos, estos son los nodos que no pertenecen a
ninguna de las dos categorías anteriores. En el ejemplo: 'B', 'C', 'D', 'E', 'G' y 'J'.

Otra característica que normalmente tendrán nuestros árboles es que todos los nodos contengan el
mismo número de punteros, es decir, usaremos la misma estructura para todos los nodos del árbol.
Esto hace que la estructura sea más sencilla, y por lo tanto también los programas para trabajar con
ellos.

Tampoco es necesario que todos los nodos hijos de un nodo concreto existan. Es decir, que pueden
usarse todos, algunos o ninguno de los punteros de cada nodo.

Un árbol en el que en cada nodo o bien todos o ninguno de los hijos existe, se llama árbol completo.

En una cosa, los árboles se parecen al resto de las estructuras que hemos visto: dado un nodo
cualquiera de la estructura, podemos considerarlo como una estructura independiente. Es decir, un
nodo cualquiera puede ser considerado como la raíz de un árbol completo.

Existen otros conceptos que definen las características del árbol, en relación con su tamaño:

Orden: es el número potencial de hijos que puede tener cada elemento de árbol. De este modo,
diremos que un árbol en el que cada nodo puede apuntar a otros dos es de orden dos, si puede
apuntar a tres será de orden tres, etc.

Grado: el número de hijos que tiene el elemento con más hijos dentro del árbol. En el árbol del
ejemplo, el grado es tres, ya que tanto 'A' como 'D' tienen tres hijos, y no existen elementos con
más de tres hijos.

Nivel: se define para cada elemento del árbol como la distancia a la raíz, medida en nodos. El nivel
de la raíz es cero y el de sus hijos uno. Así sucesivamente. En el ejemplo, el nodo 'D' tiene nivel 1, el
nodo 'G' tiene nivel 2, y el nodo 'N', nivel 3.

Altura: la altura de un árbol se define como el nivel del nodo de mayor nivel. Como cada nodo de
un árbol puede considerarse a su vez como la raíz de un árbol, también podemos hablar de altura
de ramas. El árbol del ejemplo tiene altura 3, la rama 'B' tiene altura 2, la rama 'G' tiene altura 1, la
'H' cero, etc.

Los árboles de orden dos son bastante especiales, de hecho, les dedicaremos varios capítulos. Estos
árboles se conocen también como árboles binarios.
Frecuentemente, aunque tampoco es estrictamente necesario, para hacer más fácil moverse a
través del árbol, añadiremos un puntero a cada nodo que apunte al nodo padre. De este modo
podremos avanzar en dirección a la raíz, y no sólo hacia las hojas.

Es importante conservar siempre el nodo raíz ya que es el nodo a partir del cual se desarrolla el
árbol, si perdemos este nodo, perderemos el acceso a todo el árbol.
Conclusión

Una pila es un TDA dedicado al almacenamiento y manipulación de elementos, sin que importe (a
nivel conceptual) el tipo de dato que sean. Como TDA, su funcionalidad es siempre la misma,
independientemente de la implementación que se haya utilizado. Esta funcionalidad cumple con la
regla LIFO (el orden de salida de los elementos es inverso al de entrada) y es justamente lo que
determina a una pila, pues fue pensada como una estructura para apilar y Desapilar elementos. Por
esto, las pilas poseen un único punto lógico de acceso y salida para sus elementos, y sólo vemos el
último insertado.

las colas circulares son una manera eficiente de aprovechar el espacio disponible, que muchas veces
no se puede aprovechar a través de las colas lineales.

Luego de concluir el tema, debemos tener en cuenta que un árbol como estructura de datos nos
permite almacenar una cantidad significativa de datos de forma ordenada. Un árbol se representa
con un conjunto de nodos entrelazados entre sí por medio de ramas, debemos tener en cuenta que
el nodo base es único, y se le denomina raíz. En un árbol un padre puede tener varios hijos, pero un
hijo solo puede tener un padre. Desde la raíz se puede llegar a cualquier nodo progresando por las
ramas y atravesando los sucesivos niveles estableciendo así un camino.
Trabajo en clase 7/05/2018

Das könnte Ihnen auch gefallen