Pila
Pila
Pila
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 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 anterior
(apilado con anterioridad), que pasa a ser el último, el nuevo TOS.
Las pilas suelen emplearse en los siguientes contextos:
Historia[editar]
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.
Pilas Hardware[editar]
Un uso muy común de las pilas a nivel de arquitectura hardware es la asignación de
memoria.
Soporte de Hardware[editar]
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:
Soporte de Software[editar]
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.
Seguridad[editar]
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
éstas 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. Ésta técnica 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[editar]
Descargar Código.[editar]
Clase Nodo[editar]
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 siguinte;//Correguir atributo 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 getSiguinte() {
21 return siguinte;
22 }
23 public void setSiguinte(Nodo siguinte) {
24 this.siguinte = siguinte;
25 }
26 }
Clase Pila[editar]
1 package pilas;
2 /**
3 *
4 * @author Mauricio López Ramírez
5 */
6 public class Pila {
7
8 Nodo raiz;
9
10 public void apilar(char dato) {
11 Nodo nuevo = new Nodo(dato);
12 if (raiz == null) {
13 raiz = nuevo;
14 } else {
15 nuevo.setSiguinte(raiz);
16 raiz = nuevo;
17 }
18 }
19
20 public char desapilar() {
21 Nodo temp = raiz;
22 raiz = raiz.getSiguinte();
23 return temp.getDato();
24 }
25
26 public void imprimir() {
27 Nodo temp = raiz;
28 while (temp != null) {
29 System.out.print(temp.getDato() + "\n");
30 temp = temp.getSiguinte();
31 }
32 }
33
34 }
Clase Manejador[editar]
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 }
La lista enlazada es un TDA que nos permite almacenar datos en una forma organizada, al igual
que los vectores pero, a diferencia que estos, esta estructura es dinámica, por lo que no
tenemos que saber “a prioridad “los elementos que puede contener
Struct lista{
Gint dato;
Lista *sgte;
};
Estructura de un nodo:
Cada nodo es un registro con dos campos: un campo dato y un campo siguiente, el primero es
información y el segundo es apuntador que es una referencia al siguiente nodo de la lista. El
último nodo de la lista contiene una referencia siguiente “null”
Caracteristicas:
- Listas dobles lineales: en este tipo de lista doble, tanto el puntero izquierdo del primer
nodo como el derecho del último nodo apuntan a null.
- Listas dobles circulares: En este tipo de lista doble, el puntero izquierda del primer
nodo apunta al último nodo de la lista, y el puntero derecho del
- 6 último nodo apunta al primer nodo de la lista.
VENTAJAS:
En algunas aplicaciones podemos correr la lista hacia adelante y hacia atrás, o dado elemento
podemos conocer el elemento siguiente o anterior.
Otra ventaja de las listas doblemente enlazadas es que podemos usar un puntero celda que
contiene i-esimo elemento de una lista representar la posición i, mejor que usar el puntero a la
celda anterior lo cual también es posible.
DESVENTAJA: