Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Pila (Informática)
Pila (Informática)
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 Representación simplificada de
(o 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 Diagrama de flujo para resolver una expresión en notación postfija
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 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/~palsber
g/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.
7 capacidad=cap;
8 pila=new int[capacidad];
9 top=-1;
10 }
11
13 return(top==-1);
14 }
15
17 return((top+1)==capacidad);
18 }
19
21 if(estaLlena()==false)
22 pila[++top]=elemento;
23 else
25 }
26
28 if(estaVacia()==false){
29 return pila[top--];
30 }
31 else{
33 }
34 return -1;
35 }
36
39 pilita.apilar(1);
40 pilita.apilar(12);
41 pilita.apilar(3);
42 int r=pilita.desapilar();
44 boolean b=pilita.estaVacia();
45 boolean c=pilita.estaLlena();
48 }
49 }
Enseguida se presenta la implementación de la Pila de forma dinámica, implementada en base a una lista
simplemente enlazada:
Descargar Código (https://trabajosdeotrosparalau.blogspot.com/2019/06/
pilas-en-java-ejemplo-y-codigo.html).
Clase Nodo
1 package pilas;
2 /**
3 *
5 */
10
12 this.dato = dato;
13 }
15 return dato;
16 }
18 this.dato = dato;
19 }
21 return siguiente;
22 }
24 this.siguiente = siguiente;
25 }
26 }
Clase Pila
1 package pilas;
2 /**
3 *
5 */
12 if (tos == null) {
13 tos = nuevo;
14 } else {
15 nuevo.setSiguiente(tos);
16 tos = nuevo;
17 }
18 }
19
22 tos = tos.getSiguiente();
23 return temp.getDato();
24 }
25
29 System.out.print(temp.getDato() + "\n");
30 temp = temp.getSiguiente();
31 }
32 }
33
34 }
Clase Manejador
1 package pilas;
3 /**
4 *
6 */
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
_Structures/Stacks_and_Queues)
Distintas implementaciones del manejo de pilas en RosettaCode.org (http://rosettacode.org/
wiki/Stack)
Implementación en java desde: trabajosdeotrosparalau.blogspot.com (https://trabajosdeotro
sparalau.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=139340081»
Esta página se editó por última vez el 28 oct 2021 a las 04:13.
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.