Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Una pila (stack en inglés) es una lista ordenada o estructura de datos que
permite almacenar y recuperar datos, siendo el modo de acceso a sus
elementos de tipo LIFO (del inglés Last In, First Out, «último en entrar,
primero en salir») . Esta estructura se aplica en multitud de supuestos en
el área de informática debido a su simplicidad y capacidad de dar
respuesta a numerosos procesos.
Para el manejo de los datos cuenta con dos operaciones básicas: apilar
(push), que coloca un objeto en la pila, y su operación inversa, retirar (o
Representación simplificada de
desapilar, pop), que retira el último elemento apilado.
una pila
En un sistema operativo cada proceso tiene un espacio de memoria (pila) para almacenar valores y llamadas a
funciones.
Una pila acotada es una pila limitada a un tamaño máximo impuesto en su especificación.
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 equivaldría a retirarlo.
Índice
Historia
Pila como tipo abstracto de datos
Operaciones
Pilas Hardware
Arquitectura básica de una pila
Soporte de Hardware
Soporte de Software
Expresión de evaluación y análisis sintáctico
Implementación en aplicaciones informáticas
Tiempo de ejecución de la gestión de memoria
Solucionar problemas de búsqueda
Seguridad
Pilas en Java
Descargar Código.
Clase Nodo
Clase Pila
Clase Manejador
Véase también
Enlaces externos
Historia
El método de pila para la evaluación de expresiones fue propuesto en 1955 y dos años después patentado por
Friedrich L. Bauer, quién recibió en 1988 el premio "IEEE Computer Society Pioneer Award" por su trabajo
en el desarrollo de dicha estructura de datos.
Operaciones
Habitualmente, junto a las dos operaciones básicas de apilar y desapilar (push, pop), las pilas puede
implementar otra serie de funciones:
Otro tipo de estructura de datos es la cola (FIFO, del inglés First In First Out), «primero en entrar, primero en
salir».
Pilas Hardware
Un uso muy común de las pilas a nivel de arquitectura hardware es la asignación de memoria.
Apilar: colocar un nuevo dato en la pila. Se lee el puntero para localizar el último elemento, se
incorpora a continuación de este y se redirecciona el puntero para que apunte al nuevo dato
incorporado.
Desapilar: extraer un dato de la pila. Se localiza el último dato mediante el puntero, se lee el
dato y se redirecciona el puntero al elemento inmediato anterior para que vuelva a apuntar al
último dato de la pila.
Una pila queda definida por su origen (una dirección de memoria), y su capacidad para almacenar datos.
Cuando se intenta leer más allá de su origen (esto es, se intenta leer un elemento cuando está vacía) o cuando
se intenta sobrepasar su capacidad de almacenar elementos, se produce un error: error por desbordamiento.
Se puede visualizar una pila de datos (independientemente de cómo se almacene en la memoria) como una
serie de datos colocados unos sobre otros (representación que se corresponde con el mundo real) o como una
sucesión de datos colocados de izquierda a derecha, unos tras otros.
Una pila ocuparía un bloque de celdas de memoria, con una dirección de origen, un espacio reservado para la
acumulación de datos y un puntero que apunta al último dato incorporado. La estructura que adopte una pila
puede ser muy variada: almacenando datos en direcciones crecientes o decrecientes, con capacidad de
almacenamiento flexible, con punteros que apunten al último elemento o a la posición que deberá ocupar el
próximo elemento que se incorpore… En cualquier caso, quedará definida por su algoritmo: último en entrar,
primero en salir.
Soporte de Hardware
Muchas CPUs tienen registros que se pueden utilizar como punteros de pila. Algunas, como Intel x86, tienen
instrucciones especiales que implícitan el uso de un registro dedicado a la tarea de ser un puntero de pila.
Otras, como DEC PDP-11 y de la familia 68000 de Motorola tienen que hacer frente a los modos de hacer
posible la utilización de toda una serie de registros como un puntero de pila. La serie Intel 80x87 de
coprocesadores numéricos tiene un conjunto de registros al que se puede acceder ya sea como una pila o como
una serie de registros numerados. Algunos microcontroladores, por ejemplo algunos PICs, tienen un fondo fijo
de pila que no es directamente accesible. También hay una serie de microprocesadores que aplican una pila
directamente en el hardware:
Muchas pilas basadas en los microprocesadores se utilizan para aplicar el lenguaje de programación Forth en el
nivel de microcódigo. también se utilizaron las pilas como base de una serie de mainframes y miniordenadores.
Esas máquinas fueron llamadas máquina de pila, el más famoso es el Burroughs B5000.
Soporte de Software
En programas de aplicación escrito en un lenguaje de alto nivel, una pila puede ser implementada de manera
eficiente, ya sea usando vectores o listas enlazadas. En LISP no hay necesidad de aplicar la pila, puesto que las
funciones apilar y desapilar están disponibles para cualquier lista. Adobe PostScript también está diseñada en
torno a una pila que se encuentra directamente visible y manipuladas por el programador. El uso de las pilas
está muy presente en el desarrollo de software por ello la importancia de las pilas como tipo abstracto de datos.
Por ejemplo, el cálculo: ((1 + 2) * 4) + 3, se traduciría o notación postfija con la ventaja de no tener que
atender a la jerarquía de prioridades:
En notación postfija: 1 2 + 4 * 3 +
1 Apilar operando
1
2 Apilar operando
1, 2
+ Sumar operandos*
3
4 Apilar operando
3, 4
* Multiplicar
operandos* 12
3 Apilar operando
12, 3
+ Sumar operandos*
15
Implementación en
aplicaciones informáticas
Supongamos que se está procesando una
función y en su interior llama a otra
función. La función se abandona para
procesar la función de la llamada, pero Diagrama de flujo para resolver una expresión en notación postfija
antes se almacena en una pila la dirección
que apunta a la función. Ahora
supongamos que esa nueva función llama a su vez a otra función. Igualmente, se almacena su dirección, se
abandona y se atiende la petición. Así en tantos casos como existan peticiones. La ventaja de la pila es que no
requiere definir ninguna estructura de control ni conocer las veces que el programa estará saltando entre
funciones para después retomarlas, con la única limitación de la capacidad de almacenamiento de la pila.
Conforme se van cerrando las funciones, se van rescatando las funciones precedentes mediante sus direcciones
almacenadas en la pila y se va concluyendo su proceso, esto hasta llegar a la primera.
El caso típico es el de una función recursiva (que se llama a sí misma), esto es posible implementarlo con
sencillez mediante una pila. La función se llama a sí misma tantas veces como sea necesario hasta que el
resultado de la función cumpla la condición de retorno; entonces, todas las funciones abiertas van completando
su proceso en cascada. No se necesita saber cuántas veces se anidará y, por tanto, tampoco cuando se cumplirá
la condición, con la única limitación de la capacidad de la pila. De sobrepasarse ese límite, normalmente
porque se entra en un bucle sin final, se produce el «error de desbordamiento de la pila».
La ordenación de datos por el método de la burbuja se resuelve mediante una función recursiva.
Forth utiliza dos pilas, una para pasar argumentos y una subrutina de direcciones de retorno. El uso de una pila
de retorno es muy común, pero el uso poco habitual de un argumento para una pila legible para humanos es el
lenguaje de programación Forth razón que se denomina una pila basada en el idioma.
Muchas máquinas virtuales también están orientadas hacia la pila, incluida la p-código máquina y la máquina
virtual Java.
Casi todos los entornos de computación de tiempo de ejecución de memoria utilizan una pila especial PILA
para tener información sobre la llamada de un procedimiento o función y de la anidación con el fin de cambiar
al contexto de la llamada a restaurar cuando la llamada termina. Ellos siguen un protocolo de tiempo de
ejecución entre el que llama y el llamado para guardar los argumentos y el valor de retorno en la pila. Pila es
una forma importante de apoyar llamadas anidadas o a funciones recursivas. Este tipo de pila se utiliza
implícitamente por el compilador para apoyar CALL y RETURN estados (o sus equivalentes), y no es
manipulada directamente por el programador.
Algunos lenguajes de programación utilizan la pila para almacenar datos que son locales a un procedimiento.
El espacio para los datos locales se asigna a los temas de la pila cuando el procedimiento se introduce, y son
borradas cuando el procedimiento termina. El lenguaje de programación C es generalmente aplicado de esta
manera. Utilizando la misma pila de los datos y llamadas de procedimiento tiene importantes consecuencias
para la seguridad (ver más abajo), de los que un programador debe ser consciente, a fin de evitar la
introducción de graves errores de seguridad en un programa.
Seguridad
La seguridad a la hora de desarrollar software usando estructuras de datos de tipo pila es un factor a tener en
cuenta debido a ciertas vulnerabilidades que un uso incorrecto de estas puede originar en la seguridad de
nuestro software o en la seguridad del propio sistema que lo ejecuta. Por ejemplo, algunos lenguajes de
programación usan una misma pila para almacenar los datos para un procedimiento y el enlace que permite
retornar a su invocador. Esto significa que el programa introduce y extrae los datos de la misma pila en la que
se encuentra la información crítica con las direcciones de retorno de las llamadas a procedimiento, supongamos
que al introducir datos en la pila lo hacemos en una posición errónea de manera que introducimos datos de
mayor tamaño al soportado por la pila corrompiendo así las llamadas a procedimientos, provocaríamos un fallo
en nuestro programa. Esta técnica (http://www.cs.ucla.edu/~palsberg/paper/sas03.pdf) usada de forma
maliciosa (es similar, pero en otro ámbito al buffer overflow) permitiría a un atacante modificar el
funcionamiento normal de nuestro programa y nuestro sistema, y es al menos una técnica útil si no lo evitamos
en lenguajes muy populares como el ejemplo C++.
Pilas en Java
Este tipo de estructura de datos se puede implementar de forma dinámica o estática, es decir, ya sea con un
arreglo o con una lista enlazada. Al hablar de una pila estática, se considera que la pila tendrá un tamaño
definido y no podrá superar dicha capacidad para el almacenamiento de más información, solamente la
indicada. Y con respecto a una pila dinámica corresponde a una pila que no tendrá un límite de capacidad, es
decir, podemos hacer n número de inserciones.
Enseguida se presenta la implementación de la Pila de forma dinámica, implementada en base a una lista
simplemente enlazada:
Clase Nodo
1 package pilas;
2 /**
3 *
4 * @author Mauricio López Ramírez
5 */
6 public class Nodo {
7
8 private char dato;
9 private Nodo siguiente;
10
11 public Nodo(char dato) {
12 this.dato = dato;
13 }
14 public char getDato() {
15 return dato;
16 }
17 public void setDato(char dato) {
18 this.dato = dato;
19 }
20 public Nodo getSiguiente() {
21 return siguiente;
22 }
23 public void setSiguiente(Nodo siguiente) {
24 this.siguiente = siguiente;
25 }
26 }
Clase Pila
1 package pilas;
2 /**
3 *
4 * @author Mauricio López Ramírez
5 */
6 public class Pila {
7
8 Nodo tos;//Top Of Stack
9
10 public void apilar(char dato) {
11 Nodo nuevo = new Nodo(dato);
12 if (tos == null) {
13 tos = nuevo;
14 } else {
15 nuevo.setSiguiente(tos);
16 tos = nuevo;
17 }
18 }
19
20 public char desapilar() {
21 Nodo temp = tos;
22 tos = tos.getSiguiente();
23 return temp.getDato();
24 }
25
26 public void imprimir() {
27 Nodo temp = tos;
28 while (temp != null) {
29 System.out.print(temp.getDato() + "\n");
30 temp = temp.getSiguiente();
31 }
32 }
33
34 }
Clase Manejador
1 package pilas;
2
3 /**
4 *
5 * @author Mauricio López Ramírez
6 */
7 public class Manejador {
8
9 public static void main(String[] args) {
10 Pila nuevaPila = new Pila();
11 nuevaPila.apilar('A');
12 nuevaPila.apilar('B');
13 nuevaPila.apilar('C');
14 nuevaPila.imprimir();
15 System.out.println();
16 nuevaPila.desapilar();
17 nuevaPila.imprimir();
18 }
19
20 }
Véase también
Listas
Pilas Acotadas
Colas
Enlaces externos
Estructuras de datos/Pilas y colas, en Wikibooks (inglés) (https://en.wikibooks.org/wiki/Data_St
ructures/Stacks_and_Queues)
Distintas implementaciones del manejo de pilas en RosettaCode.org (http://rosettacode.org/wik
i/Stack)
Implementación en java desde: trabajosdeotrosparalau.blogspot.com (https://trabajosdeotrospa
ralau.blogspot.com/2019/06/pilas-en-java-ejemplo-y-codigo.html)
Obtenido de «https://es.wikipedia.org/w/index.php?title=Pila_(informática)&oldid=128017757»
Esta página se editó por última vez el 26 jul 2020 a las 03:57.
El texto está disponible bajo la Licencia Creative Commons Atribución Compartir Igual 3.0; pueden aplicarse cláusulas
adicionales. Al usar este sitio, usted acepta nuestros términos de uso y nuestra política de privacidad.
Wikipedia® es una marca registrada de la Fundación Wikimedia, Inc., una organización sin ánimo de lucro.