Una
pila
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
(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 como tipo abstracto de datos
A
modo de resumen tipo 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. (constructor)
- Tamaño: regresa el numero 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á vacía o falso en caso contrario (empty).
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
En C++
#ifndef PILA
#define PILA // define la pila
template <class T>
class Pila {
private:
struct Nodo {
T elemento;
Nodo* siguiente; // coloca el nodo en la segunda posicion
}* ultimo;
unsigned int elementos;
public:
Pila() {
elementos = 0;
}
~Pila() {
while (elementos != 0) pop();
}
void push(const T& elem) {
Nodo* aux = new Nodo;
aux->elemento = elem;
aux->siguiente = ultimo;
ultimo = aux;
++elementos;
}
void pop() {
Nodo* aux = ultimo;
ultimo = ultimo->siguiente;
delete aux;
--elementos;
}
T cima() const {
return ultimo->elemento;
}
bool vacia() const {
return elementos == 0;
}
unsigned int altura() const {
return elementos;
}
};
#endif
Muy buena informacion
ResponderEliminaresta muy fina tu informacion sobre todo con ese ejercicio
ResponderEliminaresta buena tu informacion me parece que esta muy bueno ese ejercicio
ResponderEliminar