listas pilas exposicion

33
listas Empezaremos por una definición sencilla: Las listas son una sucesión de cero o más elementos. Esta es una definición muy simple y que no aclara demasiado en términos informáticos, así que profundizaremos un poco más. Hay varios tipos de listas, las hay enlazadas, no enlazadas, ordenadas y no ordenadas. Nosotros vamos a estudiar las listas enlazadas, tanto ordenadas como no ordenadas. La diferencia que existe entre las listas enlazadas y las no enlazadas es que las enlazadas utilizan punteros, es decir, asignación dinámica de memoria, lo que optimiza la gestión de la misma. Una lista no enlazada es un simple array, y por lo tanto es un bloque contiguo de memoria, mientras que una lista enlazada es un conjunto de nodos que no tienen por qué ocupar posiciones contiguas de memoria. La diferencia entre listas ordenadas y no ordenadas es obvia, las ordenadas mantienen cierto orden entre sus elementos. A partir de ahora nos centraremos en las listas enlazadas no ordenadas. Una lista es una sucesión de nodos en la que a partir de un nodo se puede acceder al que ocupa la siguiente posición en la lista. Esta característica nos indica que el acceso a las listas es secuencial y no indexado, por lo que para acceder al último elemento de la lista hay que recorrer los n-1 elementos previos (n es el tamaño de la lista). Para que un nodo pueda acceder al siguiente y la lista no se rompa en varias listas cada nodo tiene que tener un puntero que guarde la dirección de memoria que ocupa el siguiente elemento. De esta forma un nodo se podría representar esquemáticamente así: En el campo información se almacena el objeto a guardar y el puntero mantendrá la conexión con el nodo siguiente. De esta forma al ir añadiendo nodos se iría formando una sucesión de nodos encadenados mediante punteros. Lista enlazada

Transcript of listas pilas exposicion

Page 1: listas  pilas exposicion

listasEmpezaremos por una definición sencilla:Las listas son una sucesión de cero o más elementos.Esta es una definición muy simple y que no aclara demasiado en términos informáticos, así que profundizaremos un poco más.Hay varios tipos de listas, las hay enlazadas, no enlazadas, ordenadas y no ordenadas. Nosotros vamos a estudiar las listas enlazadas, tanto ordenadas como no ordenadas.La diferencia que existe entre las listas enlazadas y las no enlazadas es que las enlazadas utilizan punteros, es decir, asignación dinámica de memoria, lo que optimiza la gestión de la misma. Una lista no enlazada es un simple array, y por lo tanto es un bloque contiguo de memoria, mientras que una lista enlazada es un conjunto de nodos que no tienen por qué ocupar posiciones contiguas de memoria.La diferencia entre listas ordenadas y no ordenadas es obvia, las ordenadas mantienen cierto orden entre sus elementos.A partir de ahora nos centraremos en las listas enlazadas no ordenadas.Una lista es una sucesión de nodos en la que a partir de un nodo se puede acceder al que ocupa la siguiente posición en la lista. Esta característica nos indica que el acceso a las listas es secuencial y no indexado, por lo que para acceder al último elemento de la lista hay que recorrer los n-1 elementos previos (n es el tamaño de la lista).Para que un nodo pueda acceder al siguiente y la lista no se rompa en varias listas cada nodo tiene que tener un puntero que guarde la dirección de memoria que ocupa el siguiente elemento. De esta forma un nodo se podría representar esquemáticamente así:

En el campo información se almacena el objeto a guardar y el puntero mantendrá la conexión con el nodo siguiente.De esta forma al ir añadiendo nodos se iría formando una sucesión de nodos encadenados mediante punteros.

Lista enlazada

En Ciencias de la Computación, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior o posterior. El principal beneficio de las listas enlazadas respecto a los vectores convencionales es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento.

Page 2: listas  pilas exposicion

Una lista enlazada es un tipo de dato autorreferenciado porque contienen un puntero o enlace (en inglés link, del mismo significado) a otro dato del mismo tipo. Las listas enlazadas permiten inserciones y eliminación de nodos en cualquier punto de la lista en tiempo constante (suponiendo que dicho punto está previamente identificado o localizado), pero no permiten un acceso aleatorio. Existen diferentes tipos de listas enlazadas: listas enlazadas simples, listas doblemente enlazadas, listas enlazadas circulares y listas enlazadas doblemente circulares.

Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales como Lisp y Scheme tiene estructuras de datos ya construidas, junto con operaciones para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales como C o C++ y Java, respectivamente, disponen de referencias para crear listas enlazadas.

Listas enlazadas lineales[editar]Listas simples enlazadas[editar]

Es una lista enlazada de nodos, donde cada nodo tiene un único campo de enlace. Una variable de referencia contiene una referencia al primer nodo, cada nodo (excepto el último) enlaza con el nodo siguiente, y el enlace del último nodo contiene para indicar el final de la lista. Aunque normalmente a la variable de referencia se la suele llamar top, se le podría llamar como se deseeListas doblemente enlazadas[editar]Artículo principal: Lista doblemente enlazada

Un tipo de lista enlazada más sofisticado es la lista doblemente enlazada o lista enlazadas de dos vías. Cada nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL si es el primer nodo; y otro que apunta al nodo siguiente, o apunta al valor NULL si es el último nodo.En algún lenguaje de muy bajo nivel, XOR-Linking ofrece una vía para implementar listas doblemente enlazadas, usando una sola palabra para ambos enlaces, aunque esta técnica no se suele utilizar.

Listas enlazadas circulares[editar]En una lista enlazada circular, el primer y el último nodo están unidos juntos. Esto se puede hacer tanto para listas enlazadas simples como para las doblemente enlazadas. Para recorrer una lista enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier dirección hasta que se regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas circulares pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas es el más usado para dirigir buffers para “ingerir” datos, y para visitar todos los nodos de una lista a partir de uno dado.

Una lista enlazada circular que contiene tres valores enteros

Listas enlazadas simples circulares[editar]

Page 3: listas  pilas exposicion

Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que el siguiente nodo del último apunta al primero. Como en una lista enlazada simple, los nuevos nodos pueden ser solo eficientemente insertados después de uno que ya tengamos referenciado. Por esta razón, es usual quedarse con una referencia solamente al último elemento en una lista enlazada circular simple, esto nos permite rápidas inserciones al principio, y también permite accesos al primer nodo desde el puntero del último nodo. 1

Listas enlazadas doblemente circulares[editar]

En una lista enlazada doblemente circular, cada nodo tiene dos enlaces, similares a los de la lista doblemente enlazada, excepto que el enlace anterior del primer nodo apunta al último y el enlace siguiente del último nodo, apunta al primero. Como en una lista doblemente enlazada, las inserciones y eliminaciones pueden ser hechas desde cualquier punto con acceso a algún nodo cercano. Aunque estructuralmente una lista circular doblemente enlazada no tiene ni principio ni fin, un puntero de acceso externo puede establecer el nodo apuntado que está en la cabeza o al nodo cola, y así mantener el orden tan bien como en una lista doblemente enlazada.

Nodos centinelas[editar]A veces las listas enlazadas tienen un nodo centinela (también llamado falso nodo o nodo ficticio) al principio o al final de la lista, el cual no es usado para guardar datos. Su propósito es simplificar o agilizar algunas operaciones, asegurando que cualquier nodo tiene otro anterior o posterior, y que toda la lista (incluso alguna que no contenga datos) siempre tenga un “primer y último” nodo.

Aplicaciones de las listas enlazadas[editar]Las listas enlazadas son usadas como módulos para otras muchas estructuras de datos, tales como pilas, colas y sus variaciones.El campo de datos de un nodo puede ser otra lista enlazada. Mediante este mecanismo, podemos construir muchas estructuras de datos enlazadas con listas; esta practica tiene su origen en el lenguaje de programación Lisp, donde las listas enlazadas son una estructura de datos primaria (aunque no la única), y ahora es una característica común en el estilo de programación funcional.A veces, las listas enlazadas son usadas para implementar vectores asociativos, y estas en el contexto de las llamadas listas asociativas. Hay pocas ventajas en este uso de las listas enlazadas; hay mejores formas de implementar éstas estructuras, por ejemplo con árboles binarios de búsqueda equilibrados. Sin embargo, a veces una lista enlazada es dinámicamente creada fuera de un subconjunto propio de nodos semejante a un árbol, y son usadas más eficientemente para recorrer ésta serie de datos.

Ventajas[editar]Como muchas opciones en programación y desarrollo, no existe un único método correcto para resolver un problema. Una estructura de lista enlazada puede trabajar bien en un caso pero causar problemas en otros. He aquí una lista con algunas de las ventajas más comunes que implican las estructuras de tipo lista. En general, teniendo una colección dinámica donde los elementos están siendo añadidos y eliminados frecuentemente e importa la localización de los nuevos elementos introducidos se incrementa el beneficio de las listas enlazadas.

Page 4: listas  pilas exposicion

Listas enlazadas vs. vectores o matrices[editar]Vector Lista Enlazada

Indexado O(1) O(n)

Inserción / Eliminación al final O(1) O(1) or O(n)2

Inserción / Eliminación en la mitad O(n) O(1)

Persistencia No Simples sí

Localidad Buena Mala

Las listas enlazadas poseen muchas ventajas sobre los vectores. Los elementos se pueden insertar en una lista indefinidamente mientras que un vector tarde o temprano se llenará o necesitará ser redimensionado, una costosa operación que incluso puede no ser posible si la memoria se encuentra fragmentada.En algunos casos se pueden lograr ahorros de memoria almacenando la misma ‘cola’ de elementos entre dos o más listas – es decir, la lista acaba en la misma secuencia de elementos. De este modo, uno puede añadir nuevos elementos al frente de la lista manteniendo una referencia tanto al nuevo como a los viejos elementos - un ejemplo simple de una estructura de datos persistente.Por otra parte, los vectores permiten acceso aleatorio mientras que las listas enlazadas sólo permiten acceso secuencial a los elementos. Las listas enlazadas simples, de hecho, solo pueden ser recorridas en una dirección. Esto hace que las listas sean inadecuadas para aquellos casos en los que es útil buscar un elementos por su índice rápidamente, como el heapsort. El acceso secuencial en los vectores también es más rápido que en las listas enlazadas.Otra desventaja de las listas enlazadas es el almacenamiento extra necesario para las referencias, que a menudos las hacen poco prácticas para listas de pequeños datos como caracteres o valores booleanos.También puede resultar lento y abusivo el asignar memoria para cada nuevo elemento. Existe una variedad de listas enlazadas que contemplan los problemas anteriores para resolver los mismos. Un buen ejemplo que muestra los pros y contras del uso de vectores sobre listas enlazadas es la implementación de un programa que resuelva el problema de Josephus. Este problema consiste en un grupo de personas dispuestas en forma de círculo. Se empieza a partir de una persona predeterminadas y se cuenta n veces, la persona n-ésima se saca del círculo y se vuelve a cerrar el grupo. Este proceso se repite hasta que queda una sola persona, que es la que gana. Este ejemplo muestra las fuerzas y debilidades de las listas enlazadas frente a los vectores, ya que viendo a la gente como nodos conectados entre sí en una lista circular se observa como es más fácil suprimir estos nodos. Sin embargo, se ve como la lista perderá utilidad cuando haya que encontrar a la siguiente persona a borrar. Por otro lado, en un vector el suprimir los nodos será costoso ya que no se puede quitar un elemento sin reorganizar el resto. Pero en la búsqueda de la n-ésima persona tan sólo basta con indicar el índice n para acceder a él resultando mucho más eficiente.

Doblemente enlazadas vs. simplemente enlazadas[editar]

Page 5: listas  pilas exposicion

Las listas doblemente enlazadas requieren más espacio por nodo y sus operaciones básicas resultan más costosas pero ofrecen una mayor facilidad para manipular ya que permiten el acceso secuencial a lista en ambas direcciones. En particular, uno puede insertar o borrar un nodo en un número fijo de operaciones dando únicamente la dirección de dicho nodo (Las listas simples requieren la dirección del nodo anterior para insertar o suprimir correctamente). Algunos algoritmos requieren el acceso en ambas direcciones.

Circulares enlazadas vs. lineales enlazadas[editar]Las listas circulares son más útiles para describir estructuras circulares y tienen la ventaja de poder recorrer la lista desde cualquier punto. También permiten el acceso rápido al primer y último elemento por medio de un puntero simple.

Nodos centinelas (header nodes)[editar]La búsqueda común y los algoritmos de ordenación son menos complicados si se usan los llamados Nodos Centinelas o Nodos Ficticios, donde cada elemento apunta a otro elemento y nunca a nulo. El Nodo Centinela o Puntero Cabeza contiene, como otro, un puntero siguiente que apunta al que se considera como primer elemento de la lista. También contiene un puntero previo que hace lo mismo con el último elemento. El Nodo Centinela es definido como otro nodo en una lista doblemente enlazada, la asignación del puntero frente no es necesaria y los puntero anterior y siguiente estarán apuntando a sí mismo en ese momento. Si los punteros anterior y siguiente apuntan al Nodo Centinela la lista se considera vacía. En otro caso, si a la lista se le añaden elementos ambos puntero apuntarán a otros nodos. Estos Nodos Centinelas simplifican muchos las operaciones pero hay que asegurarse de que los punteros anterior y siguiente existen en cada momento. Como ventaja eliminan la necesidad de guardar la referencia al puntero del principio de la lista y la posibilidad de asignaciones accidentales. Por el contrario, usan demasiado almacenamiento extra y resultan complicados en algunas operaciones.

Listas enlazadas usando vectores de nodos[editar]Los lenguajes que no aceptan cualquier tipo de referencia pueden crear uniones reemplazando los punteros por índices de un vector. La ventaja es de mantener un vector de entradas, donde cada entrada tiene campos enteros indicando el índice del siguiente elemento del vector. Pueden haber nodos sin usarse. Si no hay suficiente espacio, pueden usarse vectores paralelos.Entonces una lista enlazada puede ser construida, creado un vector con esta estructura, y una variable entera para almacenar el índice del primer elemento. (ver en la sección de implementaciones).Las utilidades de esta propuesta son:

La lista enlazada puede ser movida sobre la memoria y también ser rápidamente serializada para almacenarla en un disco o transferirla sobre una red.

Especialmente para una lista pequeña, los vectores indexados pueden ocupar mucho menos espacio que un conjunto de punteros.

La localidad de referencia puede ser mejorada guardando los nodos juntos en memoria y siendo reordenados periódicamente.

Algunas desventajas son:

Page 6: listas  pilas exposicion

Incrementa la complejidad de la implementación.

Usar un fondo general de memoria deja más memoria para otros datos si la lista es más pequeña de lo esperado ó si muchos nodos son liberados.

El crecimiento de un vector cuando está lleno no puede darse lugar (o habría que redimensionarlo) mientras que encontrar espacio para un nuevo nodo en una lista resulta posible y más fácil.

Por estas razones, la propuesta se usa principalmente para lenguajes que no soportan asignación de memoria dinámica. Estas desventajas se atenúan también si el tamaño máximo de la lista se conoce en el momento en el que el vector se crea.

Lenguajes soportados[editar]Muchos lenguajes de programación tales como Lisp y Scheme tienen listas enlazadas simples ya construidas. En muchos lenguajes de programación, estas listas están construidas por nodos, cada uno llamado cons o celda cons. Las celdas cons tienen dos campos: el car, una referencia del dato al nodo, y el cdr, una referencia al siguiente nodo. Aunque las celdas cons pueden ser usadas para construir otras estructuras de datos, este es su principal objetivo.En lenguajes que soportan tipos abstractos de datos o plantillas, las listas enlazadas ADTs o plantillas están disponibles para construir listas enlazadas. En otros lenguajes, las listas enlazadas son típicamente construidas usando referencias junto con el tipo de dato record.En la sección de implementaciones hay un ejemplo completo en C y en Maude

Almacenamiento interno y externo[editar]Cuando se construye una lista enlazada, nos enfrentamos a la elección de si almacenar los datos de la lista directamente en los nodos enlazados de la lista, llamado almacenamiento interno, o simplemente almacenar una referencia al dato, llamado almacenamiento externo. El almacenamiento interno tiene la ventaja de hacer accesos a los datos más eficientes, requiriendo menos almacenamiento global, teniendo mejor referencia de localidad, y simplifica la gestión de memoria para la lista (los datos son alojados y desalojados al mismo tiempo que los nodos de la lista).El almacenamiento externo, por otro lado, tiene la ventaja de ser más genérico, en la misma estructura de datos y código máquina puede ser usado para una lista enlazada, no importa cual sea su tamaño o los datos. Esto hace que sea más fácil colocar el mismo dato en múltiples listas enlazadas. Aunque con el almacenamiento interno los mismos datos pueden ser colocados en múltiples listas incluyendo múltiples referencias siguientes en la estructura de datos del nodo, esto podría ser entonces necesario para crear rutinas separadas para añadir o borrar celdas basadas en cada campo. Esto es posible creando listas enlazadas de elementos adicionales que usen almacenamiento interno usando almacenamiento externo, y teniendo las celdas de las listas enlazadas adicionales almacenadas las referencias a los nodos de las listas enlazadas que contienen los datos.En general, si una serie de estructuras de datos necesita ser incluida en múltiples listas enlazadas, el almacenamiento externo es el mejor enfoque. Si una serie de estructuras de datos necesitan ser incluidas en una sola lista enlazada, entonces el almacenamiento interno es ligeramente mejor, a no ser que un paquete genérico de listas genéricas que use almacenamiento externo esté disponible. Asimismo, si diferentes series de datos que

Page 7: listas  pilas exposicion

pueden ser almacenados en la misma estructura de datos son incluidos en una lista enlazada simple, entonces el almacenamiento interno puede ser mejor.Otro enfoque que puede ser usado con algunos lenguajes implica tener diferentes estructuras de datos, pero todas tienen los campos iniciales, incluyendo la siguiente (y anterior si es una lista doblemente enlazada) referencia en la misma localización. Después de definir estructuras distintas para cada tipo de dato, una estructura genérica puede ser definida para que contenga la mínima cantidad de datos compartidos por todas las estructuras y contenidos al principio de las estructuras. Entonces las rutinas genéricas pueden ser creadas usando las mínimas estructuras para llevar a cabo las operaciones de los tipos de las listas enlazadas, pero separando las rutinas que pueden manejar los datos específicos. Este enfoque es usado a menudo en rutinas de análisis de mensajes, donde varios tipos de mensajes son recibidos, pero todos empiezan con la misma serie de campos, generalmente incluyendo un campo para el tipo de mensaje. Las rutinas genéricas son usadas para añadir nuevos mensajes a una cola cuando son recibidos, y eliminarlos de la cola en orden para procesarlos. El campo de tipo de mensaje es usado para llamar a la rutina correcta para procesar el tipo específico de mensaje.En la sección implementaciones (en este mismo artículo) se expone código referente a este tema.Hay que notar que cuando usamos almacenamiento externo, se necesita dar un paso extra para extraer la información del nodo y hacer un casting dentro del propio tipo del dato. Esto es porque ambas listas, de familias y miembros, son almacenadas en dos listas enlazadas usando la misma estructura de datos (nodo), y este lenguaje no tiene tipos paramétricos.Si conocemos el número de familias a las que un miembro puede pertenecer en tiempo de compilación, el almacenamiento interno trabaja mejor. Si, sin embargo, un miembro necesita ser incluido en un número arbitrario de familias, sabiendo el número específico de familias solo en tiempo de ejecución, el almacenamiento externo será necesario.

Agilización de la búsqueda[editar]Buscando un elemento específico en una lista enlazada, incluso si esta es ordenada, normalmente requieren tiempo O (n) (búsqueda lineal). Esta es una de las principales desventajas de listas enlazadas respecto a otras estructuras. Además algunas de las variantes expuestas en la sección anterior, hay numerosas vías simples para mejorar el tiempo de búsqueda.En una lista desordenada, una forma simple para decrementar el tiempo de búsqueda medio es el mover al frente de forma heurística, que simplemente mueve un elemento al principio de la lista una vez que es encontrado. Esta idea, útil para crear cachés simples, asegura que el ítem usado más recientemente es también el más rápido en ser encontrado otra vez.Otro enfoque común es indizar una lista enlazada usando una estructura de datos externa más eficiente. Por ejemplo, podemos construir un árbol rojo-negro o una tabla hash cuyos elementos están referenciados por los nodos de las listas enlazadas. Pueden ser construidos múltiples índices en una lista simple. La desventaja es que estos índices puede necesitar ser actualizados cada vez que un nodo es añadido o eliminado (o al menos, antes que el índice sea utilizado otra vez).

Page 8: listas  pilas exposicion

Estructuras de datos relacionadas[editar]Tanto las pilas como las colas son a menudo implementadas usando listas enlazadas, y simplemente restringiendo el tipo de operaciones que son soportadas.La skip list, o lista por saltos, es una lista enlazada aumentada con capas de punteros para saltos rápidos sobre grandes números de elementos, y descendiendo hacía la siguiente capa. Este proceso continúa hasta llegar a la capa inferior, la cual es la lista actual.Un árbol binario puede ser visto como un tipo de lista enlazada donde los elementos están enlazados entre ellos mismos de la misma forma. El resultado es que cada nodo puede incluir una referencia al primer nodo de una o dos listas enlazadas, cada cual con su contenido, formando así los subárboles bajo el nodo.Una lista enlazada desenrollada es una lista enlazada cuyos nodos contiene un vector de datos. Esto mejora la ejecución de la caché, siempre que las listas de elementos estén contiguas en memoria, y reducen la sobrecarga de la memoria, porque necesitas menos metadatos para guardar cada elemento de la lista.Una tabla hash puede usar listas enlazadas para guardar cadenas de ítems en la misma posición de la tabla hash.

Implementaciones[editar]Aquí se expone el código necesario para complementar el artículo a fin de poder realizar una lectura ágil sobre el artículo y a su vez quien necesite el código pueda fácilmente encontrar el mismo si está contenido.

Operaciones sobre listas enlazadas[editar]Cuando se manipulan listas enlazadas, hay que tener cuidado con no usar valores que hayamos invalidado en asignaciones anteriores. Esto hace que los algoritmos de insertar y borrar nodos en las listas sean algo especiales. A continuación se expone el pseudocódigo para añadir y borrar nodos en listas enlazadas simples, dobles y circulares.Listas enlazadas lineales[editar]

Listas simples enlazadas[editar]

Nuestra estructura de datos tendrá dos campos. Vamos a mantener la variables PrimerNodos que siempre apunta al primer nodo de tal lista, ó nulo para la lista vacía. record Node { data // El dato almacenado en el nodo next // Una referencia al nodo siguiente, nulo para el último nodo } record List { Node PrimerNodo // Apunta al primer nodo de la lista; nulo para la lista vacía }

El recorrido en una lista enlazada es simple, empezamos por el primer nodo y pasamos al siguiente hasta que la lista llegue al final. node := list.PrimerNodo while node not null { node := node.next }

Page 9: listas  pilas exposicion

El siguiente código inserta un elemento a continuación de otro en una lista simple. El diagrama muestra como funciona.

function insertAfter(Node node, Node newNode) { newNode.next := node.next node.next := newNode }

Insertar al principio de una lista requiere una función por separado. Se necesita actualizar PrimerNodo. function insertBeginning(List list, Node newNode) { newNode.next := list.firstNode list.firstNode := newNode }

De forma similar, también tenemos funciones para borrar un nodo dado ó para borrar un nodo del principio de la lista. Ver diagrama.

function removeAfter(Node node) { obsoleteNode := node.next node.next := node.next.next destroy obsoleteNode } function removeBeginning(List list) { obsoleteNode := list.firstNode list.firstNode := list.firstNode.next destroy obsoleteNode }

Advertimos que BorrarPrincipio pone PrimerNodo a nulo cuando se borra el último elemento de la lista. Adjuntar una lista enlazada a otra puede resultar ineficiente a menos que se guarde una referencia a la cola de la lista, porque si no tendríamos que recorrer la lista en orden hasta llegar a la cola y luego añadir la segunda lista.Listas doblemente enlazadas[editar]

Con estas listas es necesario actualizar muchos más punteros pero también se necesita menos información porque podemos usar un puntero para recorrer hacia atrás y consultar elementos. Se crean nuevas operaciones y elimina algunos casos especiales. Añadimos el campo anterior a nuestros nodos, apuntando al elemento anterior, y UltimoNodo a nuestra

Page 10: listas  pilas exposicion

estructura, el cual siempre apunta al último elemento de la lista. PrimerNodo y UltimoNodo siempre están a nulo en la lista vacía. record Node { data // El dato almacenado en el nodo next // Una referencia al nodo siguiente, nulo para el último nodo prev // Una referencia al nodo anterior, nulo para el primer nodo } record List { Node firstNode // apunta al primer nodo de la lista; nulo para la lista vacía Node lastNode // apunta al último nodo de la lista; nulo para la lista vacía }

Formas de recorrer la lista:Hacia Delante node := list.firstNode while node ≠ null <do something with node.data> node := node.next

Hacia Atrás node := list.lastNode while node ≠ null <do something with node.data> node := node.prev

Estas funciones simétricas añaden un nodo después o antes de uno dado:

function insertAfter(List list, Node node, Node newNode) newNode.prev := node newNode.next := node.next if node.next = null node.next := newNode list.lastNode := newNode else node.next.prev := newNode node.next := newNode function insertBefore(List list, Node node, Node newNode) newNode.prev := node.prev newNode.next := node if node.prev is null node.prev := newNode list.firstNode := newNode else node.prev.next := newNode node.prev := newNode

También necesitamos una función para insertar un nodo al comienzo de una lista posiblemente vacía. function insertBeginning(List list, Node newNode) if list.firstNode = null list.firstNode := newNode list.lastNode := newNode

Page 11: listas  pilas exposicion

newNode.prev := null newNode.next := null else insertBefore (list, list.firstNode, newNode)

Una función simétrica que inserta al final: function insertEnd(List list, Node newNode) if list.lastNode = null insertBeginning (list, newNode) else insertAfter (list, list.lastNode, newNode)

Borrar un nodo es fácil, solo requiere usar con cuidado firstNode y lastNode. function remove(List list, Node node) if node.prev = null list.firstNode := node.next else node.prev.next := node.next if node.next = null list.lastNode := node.prev else node.next.prev := node.prev destroy node

Una consecuencia especial de este procedimiento es que borrando el último elemento de una lista se ponen PrimerNodo y UltimoNodo a nulo, habiendo entonces un problema en una lista que tenga un único elemento.Listas enlazadas circulares[editar]

Estas pueden ser simples o doblemente enlazadas. En una lista circular todos los nodos están enlazados como un círculo, sin usar nulo. Para listas con frente y final (como una cola), se guarda una referencia al último nodo de la lista. El siguiente nodo después del último sería el primero de la lista. Los elementos se pueden añadir por el final y borrarse por el principio en todo momento. Ambos tipos de listas circulares tienen la ventaja de poderse recorrer completamente empezando desde cualquier nodo. Esto nos permite normalmente evitar el uso de PrimerNodo y UltimoNodo, aunque si la lista estuviera vacía necesitaríamos un caso especial, como una variable UltimoNodo que apunte a algún nodo en la lista o nulo si está vacía. Las operaciones para estas listas simplifican el insertar y borrar nodos en una lista vacía pero introducen casos especiales en la lista vacía.

Listas enlazadas doblemente circulares[editar]

Asumiendo que someNodo es algún nodo en una lista no vacía, esta lista presenta el comienzo de una lista con someNode.Hacia Delante node := someNode do do something with node.value node := node.next while node != someNode

Hacia Atrás

Page 12: listas  pilas exposicion

node := someNode do do something with node.value node := node.prev while node := someNode

Esta función inserta un nodo en una lista enlazada doblemente circular después de un elemento dado: function insertAfter(Node node, Node newNode) newNode.next := node.next newNode.prev := node node.next.prev := newNode node.next := newNode

Para hacer "insertBefore", podemos simplificar "insertAfter (node.prev, newNode)". Insertar un elemento en una lista que puede estar vacía requiere una función especial. function insertEnd(List list, Node node) if list.lastNode = null node.prev := node node.next := node else insertAfter (list.lastNode, node) list.lastNode := node

Para insertar al principio simplificamos "insertAfter (list.lastNode, node)". function remove(List list, Node node) if node.next = node list.lastNode := null else node.next.prev := node.prev node.prev.next := node.next if node = list.lastNode list.lastNode := node.prev; destroy node

Como una lista doblemente enlazada, "removeAfter" y "removeBefore" puede ser implementada con "remove (list, node.prev)" y "remove (list, node.next)".

Listas enlazadas usando vectores de nodos[editar]Previamente se crea una estructura que contiene los apuntadores:record Entry { integer next; // índice de la nueva entrada en el vector integer prev; // entrada previa string name; real balance; }

Y finalmente se declara el vector: integer listHead;Entry Records[1000];

Implementación de una lista enlazada en CLas listas enlazadas son típicamente construidas usando referencias junto con el tipo de dato record

Page 13: listas  pilas exposicion

#include <stdio.h> /* for printf */#include <stdlib.h> /* for malloc */

typedef struct ns {int data;struct ns *next;

} node;

node *list_add(node **p, int i) { /* algunos compiladores no requieren un casting del valor del retorno para malloc */ node *n = (node *)malloc(sizeof(node)); if (n == NULL) return NULL; n->next = *p; *p = n; n->data = i; return n;}

void list_remove(node **p) { /* borrar cabeza*/ if (*p != NULL) { node *n = *p;

*p = (*p)->next;free(n);

}}

node **list_search(node **n, int i) { while (*n != NULL) { if ((*n)->data == i) { return n; } n = &(*n)->next; } return NULL;}

void list_print(node *n) { if (n == NULL) { printf("lista esta vacía\n"); } while (n != NULL) { printf("print %p %p %d\n", n, n->next, n->data); n = n->next; }}

int main(void) { node *n = NULL;

list_add(&n, 0); /* lista: 0 */ list_add(&n, 1); /* lista: 1 0 */ list_add(&n, 2); /* lista: 2 1 0 */ list_add(&n, 3); /* lista: 3 2 1 0 */ list_add(&n, 4); /* lista: 4 3 2 1 0 */ list_print(n);

Page 14: listas  pilas exposicion

list_remove(&n); /* borrar primero(4) */ list_remove(&n->next); /* borrar nuevo segundo (2) */ list_remove(list_search(&n, 1)); /* eliminar la celda que contiene el 1 (primera) */ list_remove(&n->next); /* eliminar segundo nodo del final(0)*/ list_remove(&n); /* eliminar ultimo nodo (3) */ list_print(n);

return 0;}

Implementación de una lista enlazada en C++#include <iostream> // Para cout#include <sstream> // Utilizado para validar entradas del teclado#include <new> // Utilizado para validad reservacion de memoria al utilizar el operator NEW.using namespace std

struct camera_t { int idcam; string serial; int idroom; camera_t *next; };

//Insertar al principio de una lista requiere una función por separado. Se necesita actualizar PrimerNodo.void list_add(camera_t **node_cam){ camera_t *newnode = new (nothrow) camera_t; if(newnode==NULL){ cout << "Error. No possible allocate memory to new node."; } else{ newnode->next = *node_cam; *node_cam = newnode; cout << "Hola"; }}

//El recorrido en una lista enlazada es simple, empezamos por el primer nodo y pasamos al siguiente hasta// que la lista llegue al final.void list_print(camera_t *node_cam){ if (node_cam == NULL){ cout << "Lista vacia"; } else{ while (node_cam!=NULL) { cout << "idcam: " << node_cam->idcam << "\nName: " << node_cam->name << "\nModel: " << node_cam->model;

Page 15: listas  pilas exposicion

cout << "\nSerial: " << node_cam->serial << "\nIdRoom: " << node_cam->idroom << "\nNameRoom: " << node_cam->room; cout << "\n\n"; node_cam = node_cam->next; } }}

int main(void){ string mystr; camera_t *node_cam = 0;

cout << "Ingrese los datos de la camara." << endl; list_add(&node_cam);

cout << "Indentificador de camara: 23"; node_cam->idcam = N_globalCamera; node_cam->name = "PanSonyc"; cout << "Precione una tecla para regresar al menu principal."; getline(cin,mystr);

list_print(node_cam);}

Implementación de una lista enlazada en Maude

fmod LISTA-GENERICA {X :: TRIV} is protecting NAT .

*** tipos sorts ListaGenNV{X} ListaGen{X} . subsort ListaGenNV{X} < ListaGen{X} .

*** generadores op crear : -> ListaGen{X} [ctor] . op cons : X$Elt ListaGen{X} -> ListaGenNV{X} [ctor] .

*** constructores op _::_ : ListaGen{X} ListaGen{X} -> ListaGen{X} [assoc id: crear ] . *** concatenación op invertir : ListaGen{X} -> ListaGen{X} . op resto : ListaGenNV{X} -> ListaGen{X} .

*** selectores op primero : ListaGenNV{X} -> X$Elt .

Page 16: listas  pilas exposicion

op esVacia? : ListaGen{X} -> Bool . op longitud : ListaGen{X} -> Nat .

*** variables vars L L1 L2 : ListaGen{X} . vars E E1 E2 : X$Elt .

*** ecuaciones eq esVacia?(crear) = true .eq esVacia?(cons(E, L)) = false .

eq primero(cons(E, L)) = E . eq resto(cons(E, L)) = L .

eq longitud(crear) = 0 .eq longitud(cons(E, L)) = 1 + longitud(L) . eq cons(E1, L1) :: cons(E2, L2) = cons(E1, L1 :: cons(E2, L2)) .

eq invertir(crear) = crear .eq invertir(cons(E, L)) = invertir(L) :: cons(E, crear) .

endfm

Ejemplos de almacenamiento interno y externoSuponiendo que queremos crear una lista enlazada de familias y sus miembros. Usando almacenamiento interno, la estructura podría ser como la siguiente: record member { // miembro de una familia member next string firstName integer age } record family { // // la propia familia family next string lastName string address member members // de la lista de miembros de la familia }

Para mostrar una lista completa de familias y sus miembros usando almacenamiento interno podríamos escribir algo como esto: aFamily := Families // comienzo de la lista de familias while aFamily ≠ null { // bucle a través de la lista de familias print information about family

Page 17: listas  pilas exposicion

aMember := aFamily.members // coger cabeza de esta lista de miembros de esta familia while aMember ≠ null { //bucle para recorrer la lista de miembros print information about member aMember := aMember.next } aFamily := aFamily.next }

Usando almacenamiento externo, nosotros podríamos crear las siguientes estructuras:

record node { // estructura genérica de enlace node next pointer data // puntero genérico del dato al nodo } record member { // estructura de una familia string firstName integer age } record family { // estructura de una familia string lastName string address node members // cabeza de la lista de miembros de esta familia }

Para mostrar una lista completa de familias y sus miembros usando almacenamiento externo, podríamos escribir: famNode := Families // comienzo de la cabeza de una lista de familias while famNode ≠ null { // bucle de lista de familias aFamily = (family) famNode.data // extraer familia del nodo print information about family memNode := aFamily.members // coger lista de miembros de familia while memNode ≠ null { bucle de lista de miembros aMember := (member) memNode.data // extraer miembro del nodo print information about member memNode := memNode.next } famNode := famNode.next }

Uso de listasLas listas se utilizan para organizar información. Pueden estar incluidas dentro de un artículo, o conformar un anexo independiente. En esta guía se explica cuándo y cómo usar listas apropiadamente.

Nombre[editar]Al ponerle nombre a la lista, o a la sección en la cual se incluya una lista, evite en lo posible llamarla de una forma similar a "Lista de X elementos...", suele preferirse "X elementos" a secas. El lector puede darse cuenta solo si está viendo una lista o texto desarrollado.

Introducción[editar]Ninguna lista debería ser sólo la lista en sí. Incluso si el nombre fuera claro en sí mismo, siempre se debe incluir una introducción que presente y contextualice el tema de la lista,

Page 18: listas  pilas exposicion

enlace a los artículos relacionados y establezca las características de los campos utilizados (si éstos no fueran explícitos) y el criterio de inclusión.En el caso de los artículos que incluyan listas, la sección con la lista puede prescindir de una introducción si las secciones previas ya cumplen dicha función, por ejemplo en el caso de un artículo sobre un disco musical, que seguramente incluirá la lista de canciones.

Contenido[editar]El contenido de una lista debe respetar las políticas de contenido de Wikipedia

Lo que Wikipedia no es[editar]Artículo principal: Wikipedia:Lo que Wikipedia no es

Una lista no debe tener elementos asociados libremente o sin un criterio claro. En consecuencia, las listas no deberían incluir secciones como "otros" o "miscelánea".Las listas de citas, material multimedia o documentos en el dominio público no se escriben en Wikipedia sino en sus proyectos hermanos, Wikiquote, Commons y Wikisource.No se aceptan las listas de enlaces externos, sino sólo a un número reducido de enlaces principales. Sin embargo, cuando un artículo se redacta a partir de información consultada en varias páginas de internet fiables diferentes, sí es aceptable crear una lista de tales enlaces pero en forma de notas al pie.

Punto de vista neutral[editar]Artículo principal: Wikipedia:Punto de vista neutral

El criterio de inclusión de la lista debe basarse en hechos o en características claras de los elementos, no pudiendo estar sujetos a las opiniones subjetivas de los redactores. Los criterios que recurran a palabras como "importantes", "distinguidos", "mejores" u otros juicios de valor deben reformularse o retirarse.Asimismo, si el criterio fuese controvertido y generase disputas sobre si es o no aplicable a cada elemento en concreto, no es un buen criterio. Incluso aunque se incluyeran las debidas referencias de quién considera que el elemento cumple el criterio y quién considera que no, la misma inclusión o exclusión de elementos en la lista podría ser objetada.

Verificabilidad[editar]Artículos principales: Wikipedia:Verificabilidad y Wikipedia:Wikipedia no es una fuente primaria.

Los datos reflejados en las listas, ya sean parte del criterio de inclusión o información relacionada con cada elemento, deben poder ser consultables en fuentes externas a Wikipedia. Si por ejemplo se ordena un grupo de ciudades por población, debe indicarse de dónde se obtuvo dicha información. Las fuentes que permiten verificar a todos los elementos de la tabla (aunque sea sólo uno de los varios campos de todos los elementos) son preferibles al ingreso individual de referencias por cada elemento, especialmente en el caso de tablas ordenadas.Asimismo, los criterios de inclusión no pueden basarse en análisis personales o interpretaciones no refrendadas por ninguna fuente.

Page 19: listas  pilas exposicion

Nivel de detalle[editar]Aún aplicando las políticas mencionadas, los criterios a partir de los cuales se podrían crear listas son infinitos, sólo limitables por la imaginación.Una lista abierta es una lista con un criterio lo bastante abierto o general tal que posiblemente nunca llegue a estar completa y siempre sea suceptible de tener más elementos. Por ejemplo, una lista de políticos: ¿Cuántos políticos puede haber en el mundo? Aunque el que el criterio sea abierto no es en sí un obstáculo para la creación de la lista, las listas demasiado abiertas no son recomendables, ya que requerirían un mantenimiento excesivo y serían enormemente ilegibles. En dichos casos se recomienda acotar el criterio combinándolo con otros criterios más específicos, que permitan listas más acotadas y con elementos más homogéneos entre sí. Una categoría puede ser también una solución alternativa o preferible a una lista abierta.Una lista demasiado específica y excesivamente corta, por su parte, también puede ser poco recomendable. Puede ser preferible reformularla para ampliarla, o bien describir sus elementos simplemente con texto, sin generar ninguna lista con ellos.

Listas desaconsejadas[editar]Una lista debería consistir en elementos individualizables, concretos y análogos entre sí. Cuando son conceptos generales, no delimitables, superpuestos entre sí, u ordenados simplemente por la forma en que se presenta la información, se prefiere no crear ninguna lista y en lugar de ello explicarla con texto de corrido.Una lista no debería crearse si se trata de:

Una lista creada sólo por el acto en sí de crear la lista

Una lista que reúna información indiscriminadamente

Una lista cuyo criterio de inclusión no es verificable en fuentes confiables, requiere asumir un punto de vista, realizar investigación original o interpretar libremente la información disponible.

Una lista cuyo concepto o criterio de inclusión no es relevante o enciclopédico. Dicha relevancia es independiente de la de los elementos de la lista

Una lista excesivamente abierta, o excesivamente específica.

Una lista volátil por naturaleza, con elementos que entren y salgan de la misma más rápidamente de lo que fuera razonablemente posible mantener.

Listas y categorías[editar]Además de las listas, los artículos pueden agruparse en categorías. Cada sistema tiene sus propias ventajas y desventajas, por lo que cada caso debe analizarse por separado para evaluar si se debería crear una lista, una categoría o ambas cosas.Una lista permite añadir notas a cada entrada, diagramar sus elementos repartiendo información en varias columnas, y seguir un orden cronológico o estructurado de fácil comprensión. También permite crear listas con elementos que aún no tengan escrito un artículo propio, o con elementos que no justifiquen artículos individuales. Además, permiten verificar en el historial qué elementos fueron añadidos y retirados, por quién y cuándo, lo cual es imposible de realizar con categorías. Asimismo, los nombres con

Page 20: listas  pilas exposicion

aclaraciones en su título (debido a la existencia de otros artículos que puedan usar el mismo nombre, tales como Semana Trágica (Argentina) y Semana Trágica (España)) pueden ser modificados al realizar el enlace, de forma que al leer la lista se lea sólo el nombre, mientras que la categoría muestra el título exactamente como fue escrito.Pero, por otra parte, no garantizan el enlace mutuo (la lista enlaza a sus elementos, pero los elementos no necesariamente a la lista) y no suele facilitar la navegación a través de temas más complejos o más específicos como permiten las supercategorías y subcategorías de cada categoría. Una buena lista requiere determinar y aplicar un criterio de ordenamiento, mientras que una categoría se limita a ordenar automáticamente por orden alfabético. Además, la corrección, añadido o substracción de elementos de una lista mediante un bot es mucho más elaborada que la tarea análoga en una categoría.

Anexos y artículos con listas[editar]En general, una lista puede estar localizada en un anexo o en un artículo. El criterio general para decidir si la página en cuestión debería permanecer en uno u otro espacio de nombres es el contenido que haya además de la lista.Si lo único que hay, además de la lista en sí, es una simple contextualización y definición del criterio de la lista, entonces seguramente debería pertenecer al espacio de nombres Anexo. Si, en cambio, omitiendo la lista se dispone de un artículo coherente y cohesionado, aunque incompleto sin la lista, entonces es un artículo con una lista. Si el artículo se sostiene por mérito propio y puede considerarse razonablemente completo incluso sin la lista, pero la lista en sí es legítima, entonces dicha lista debería ser desprendida del artículo y llevada a un anexo.Las páginas pueden ser trasladadas de uno a otro espacio de nombres según el caso. Una lista que figure en el espacio principal y presente las condiciones de un anexo puede ser trasladada a dicho espacio, mientras que un anexo que fuera reescrito y alcanzara la elaboración propia de un artículo con lista podría ser trasladado a dicho espacio.

Estilos de listas[editar]La siguiente es una lista de los estilos CSS y plantillas que los implementan definidos para mostrar listas:

Lista horizontal[editar] clase CSS: hlist

plantilla: {{lista plana}}

EjemplosDescripción Código Resultado

Uso con la plantilla {{lista plana}}

{{lista plana|* entrada1* entrada2 * entrada3 * entrada4 * entrada5 }}

entrada1entrada2entrada3entrada4entrada5

Uso normalmente en una plantilla <div entrada1

Page 21: listas  pilas exposicion

class="hlist">* entrada1 * entrada2 * entrada3 </div>

entrada2entrada3

Uso en una plantilla que ya tiene definido el estilo hlist por defecto

{{campaña militar|batallas=* entrada1 * entrada2 * entrada3 }}

[Contraer]

{{{nombre}}}

entrada1

entrada2

entrada3

Para mostrar la lista con guiones separando las entradas basta editar el CSS personal definido en las preferencias y añadir:.hlist li:after { content: " –";}

Lista vertical sin viñetas[editar] clase CSS: plainlist

plantillas: {{lista simple}} y {{lista sin viñetas}}. El uso de las plantillas está desaconsejado porque normalmente es posible modificar el código de la ficha donde se incluye la lista sin viñetas haciendo que utilice la clase plainlist de forma que baste escribir algo de la forma:

* entrada1 * entrada2 * entrada3 Ejemplos

Código Resultado

{{lista simple|* entrada1* entrada2 * entrada3 * entrada4 * entrada5 }}

entrada1

entrada2

entrada3

entrada4

Page 22: listas  pilas exposicion

entrada5

{{lista sin viñetas|entrada1|entrada2|entrada3|entrada4|entrada5}}

entrada1

entrada2

entrada3

entrada4

entrada5

<div class="plainlist">* entrada1 * entrada2 * entrada3 </div>

entrada1

entrada2

entrada3

entrada1 </br>entrada2 </br>entrada3

entrada1entrada2entrada3

Operaciones básicas de las listasEn toda estructura de datos hay dos operaciones que sobresalen por encima del resto: Insertar y borrar. Estas dos operaciones aparecerán en toda estructura de datos, puede que con otro nombre, o con una funcionalidad ligeramente diferente, pero su filosofía será la misma, proporcionar unas operaciones para la construcción de la estructura de datos.

InsertarLa operación insertar consiste en la introducción de un nuevo elemento en la lista.En una lista no ordenada no es necesario mantener ningún orden, por lo tanto la inserción de elementos se puede realizar en cualquier lugar de la lista, al principio, al final, en una posición aleatoria, ...Generalmente se realiza la inserción de tal forma que la complejidad temporal sea mínima, es decir, que sea una operación sencilla para que se realice en el menor tiempo posible. La operación más sencilla depende de la implementación de la estructura de datos, en unos casos puede ser la inserción al inicio, en otros la inserción al final y en este caso la inserción la realiza en el segundo nodo de la lista.Si tenemos la lista...

... e insertamos el elemento 0, la lista quedaría de la siguiente forma:

Page 23: listas  pilas exposicion

BorrarLa operación borrar consiste en la eliminación de la lista de un elemento concreto. El elemento a borrar será escogido por el programador.La eliminación en una lista no conlleva ningún trabajo adicional más que el propio de la eliminación del elemento en sí. Para borrar un elemento cualquiera habría que realizar un recorrido secuencial de la lista hasta encontrar el nodo buscado y una vez localizado reestructurar los punteros para saltarse el nodo a borrar y así poder eliminarlo.Vamos a verlo con un ejemplo. Borrado del elemento 76 en la lista anterior:Paso 1: Localizar el elemento a borrar.

Paso 2: Reestructurar punteros y eliminar nodo.

Otras operacionesA partir de estas dos operaciones básicas cada lista puede presentar muchas operaciones diferentes, vamos a comentar algunas de ellas, dejando claro que las dos básicas que siempre aparecerán son las anteriores.

Tamaño: Esta operación suele informar sobre el número de elementos que tiene en ese instante la lista.

Buscar: Comprueba si existe un determinado elemento en la lista. Recorrer lista: Recorre toda la lista, realizando una operación en cada nodo. Por ejemplo,

mostrar el contenido por pantalla.Pila (informática)

Una pila (stack en inglés) es una lista ordenada 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. Esta estructura se aplica en multitud de ocasiones en el área de informática debido a su simplicidad y ordenación implícita de la propia estructura.

Para el manejo de los datos se cuenta con dos operaciones básicas: apilar, 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.

Page 24: listas  pilas exposicion

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 contextoImplementación de recursividad.

Operaciones con las pilas

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)Vacía: devuelve cierto si la pila está sin elementos o falso en caso de que contenga uno. (empty).