Está en la página 1de 8

Pila (Informtica)

Una pila (stack en ingls) es una lista ordinal o estructura de datos en la que el modo de
acceso a sus elementos es de tipo LIFO (del ingls 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 informtica debido a su simplicidad y ordenacin
implcita de la propia estructura.
Para el manejo de los datos se cuenta con dos operaciones bsicas: apilar (push), que
coloca un objeto en la pila, y su operacin inversa, retirar (o desapilar, pop), que retira el
ltimo elemento apilado.
En cada momento slo se tiene acceso a la parte superior de la pila, es decir, al ltimo
objeto apilado (denominado TOS, Top of Stack en ingls). La operacin retirar permite la
obtencin 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 analoga con objetos cotidianos, una operacin apilar equivaldra a colocar un plato
sobre una pila de platos, y una operacin retirar a retirarlo.

A modo de resumen tipo de datos, la pila es un contenedor de nodos y tiene dos


operaciones bsicas: push (o apilar) y pop (o desapilar). 'Push' aade 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 metfora que se utiliza con frecuencia
es la idea de una pila de platos en una cafetera con muelle de pila. En esa serie, slo
la primera placa es visible y accesible para el usuario, todas las dems placas
permanecen ocultas. Como se aaden 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 metfora: En primer lugar la ltima salida es un principio, la segunda es que el
contenido de la pila est oculto. Slo 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 tendrn 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 aadir ms de uso habitual.

Crear: se crea la pila vaca. (constructor)

Tamao: regresa el numero de elementos de la pila. (size)

Apilar: se aade 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)

Vaca: devuelve cierto si la pila est vaca o falso en caso contrario (empty).

Implementacin
Un requisito tpico de almacenamiento de una pila de n elementos es O(n). El requisito
tpico de tiempo de O(1) las operaciones tambin son fciles de satisfacer con un array
o con listas enlazadas simples.
La biblioteca de plantillas de C++ estndar proporciona una "pila" clase templated que
se limita a slo apilar/desapilar operaciones. Java contiene una biblioteca de la clase
Pila que es una especializacin de Vector. Esto podra ser considerado como un defecto,
porque el diseo heredado get () de Vector mtodo LIFO ignora la limitacin de la Pila.

Cdigo para 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
Una pila tpica es un rea de la memoria de los computadores con un origen fijo y un
tamao variable. Al principio, el tamao de la pila es cero. Un puntero de pila, por lo
general en forma de un registro de hardware, apunta a la ms reciente localizacin en
la pila; cuando la pila tiene un tamao de cero, el puntero de pila de puntos en el
origen de la pila.
Las dos operaciones aplicables a todas las pilas son:

Una operacin apilar, en el que un elemento de datos se coloca en el lugar


apuntado por el puntero de pila, y la direccin en el puntero de pila se ajusta por el
tamao de los datos de partida.

Una operacin desapilar: un elemento de datos en la ubicacin actual apuntado


por el puntero de pila es eliminado, y el puntero de pila se ajusta por el tamao de
los datos de partida.

Hay muchas variaciones en el principio bsico de las operaciones de pila. Cada pila
tiene un lugar fijo en la memoria en la que comienza. Como los datos se aadirn a la
pila, el puntero de pila es desplazado para indicar el estado actual de la pila, que se
expande lejos del origen (ya sea hacia arriba o hacia abajo, dependiendo de la
aplicacin concreta).
Por ejemplo, una pila puede comenzar en una posicin de la memoria de mil, y ampliar
por debajo de las direcciones, en cuyo caso, los nuevos datos se almacenan en lugares
que van por debajo de 1000, y el puntero de pila se decrementa cada vez que un
nuevo elemento se agrega. Cuando un tema es eliminado de la pila, el puntero de pila
se incrementa.
Los punteros de pila pueden apuntar al origen de una pila o de un nmero limitado de
direcciones, ya sea por encima o por debajo del origen (dependiendo de la direccin en
que crece la pila), sin embargo el puntero de pila no puede cruzar el origen de la pila.
En otras palabras, si el origen de la pila est en la direccin 1000 y la pila crece hacia
abajo (hacia las direcciones 999, 998, y as sucesivamente), el puntero de pila nunca
debe ser incrementado ms all de 1000 (para 1001, 1002, etc.) Si un desapilar
operacin en la pila hace que el puntero de pila se deje atrs el origen de la pila, una
pila se produce desbordamiento. Si una operacin de apilar hace que el puntero de pila
incremente o decremente ms all del mximo de la pila, en una pila se produce
desbordamiento.
La pila es visualizada ya sea creciente de abajo hacia arriba (como pilas del mundo
real), o, con el mximo elemento de la pila en una posicin fija, o creciente, de
izquierda a derecha, por lo que el mximo elemento se convierte en el mximo a "la
derecha". Esta visualizacin puede ser independiente de la estructura real de la pila en
la memoria. Esto significa que rotar a la derecha es mover el primer elemento a la
tercera posicin, la segunda a la primera y la tercera a la segunda. Aqu hay dos
equivalentes visualizaciones de este proceso:

Manzana
Pltano

Pltano
==rotar a la derecha==>

Fresa

Manzana

Fresa
Pltano

Fresa

Manzana
==rotar a la izquierda==>

Manzana

Fresa
Pltano

Una pila es normalmente representada en los ordenadores por un bloque de celdas de


memoria, con los "de abajo" en una ubicacin fija, y el puntero de pila de la direccin
actual de la "cima" de clulas de la pila. En la parte superior e inferior se utiliza la
terminologa con independencia de que la pila crece realmente a la baja de direcciones
de memoria o direcciones de memoria hacia mayores.
Apilando un elemento en la pila,se ajusta el puntero de pila por el tamao de
elementos (ya sea decrementar o incrementar, en funcin de la direccin en que crece
la pila en la memoria), que apunta a la prxima celda, y copia el nuevo elemento de la
cima en rea de la pila. Dependiendo de nuevo sobre la aplicacin exacta, al final de
una operacin de apilar, el puntero de pila puede sealar a la siguiente ubicacin no
utilizado en la pila, o tal vez apunte al mximo elemento de la pila. Si la pila apunta al
mximo elemento de la pila, el puntero de pila se actualizar antes de que un nuevo
elemento se apile, si el puntero que apunta a la prxima ubicacin disponible en la pila,
que se actualizar despus de que el mximo elemento se apile en la pila.
Desapilando es simplemente la inversa de apilar. El primer elemento de la pila es
eliminado y el puntero de pila se actualiza, en el orden opuesto de la utilizada en la
operacin de apilar.

Notacin Polaca Inversa


La notacin polaca inversa, notacin de postfijo, o notacin posfija, (en ingls, Reverse
Polish notation, o RPN), es un mtodo algebraico alternativo de introduccin de datos.
Su nombre viene por analoga con la relacionada notacin polaca, una notacin de
prefijo introducida en 1920 por el matemtico polaco Jan ukasiewicz, en donde cada

operador est antes de sus operandos. En la notacin polaca inversa es al revs,


primero estn los operandos y despus viene el operador que va a realizar los clculos
sobre ellos. Tanto la notacin polaca como la notacin polaca inversa no necesitan usar
parntesis para indicar el orden de las operaciones mientras la aridad del operador sea
fija.

Funcionamiento
Su principio es el de evaluar los datos directamente cuando se introducen y manejarlos
dentro de una estructura LIFO (Last In First Out), lo que optimiza los procesos a la hora
de programar.
Bsicamente la diferencias con el mtodo algebraico o notacin de infijo es que, al
evaluar los datos directamente al introducirlos, no es necesario ordenar la evaluacin
de los mismos, y que para ejecutar un comando, primero se deben introducir todos sus
argumentos, as, para hacer una suma 'a+b=c' el RPN lo manejara a b +, dejando el
resultado 'c' directamente.
Ntese que la notacin polaca inversa no es literalmente la imagen especular de la
notacin polaca: el orden de los operandos es igual en la tres notaciones
(infijo, prefijo o polaca, y postfijo o polaca inversa), lo que cambia es que el lugar
donde va el operador. En la notacin infija, el operador va en el medio de los
operandos, mientras que en la notacin polaca va antes y en la notacin polaca inversa
va despus. As pues, "640 / 16" (en notacin de infijo), se escribe como "/ 640 16" (en
notacin polaca) y como "640 16 /" en notacin polaca inversa. El orden de los
operandos es importante cuando se manejan operadores no conmutativos (como la
resta o la divisin), as, si dividimos 10 entre 2, por ejemplo, en las tres notaciones se
debe escribir de la siguiente manera: "10 / 2", "/ 10 2", "10 2 /".

Ventajas

Los
clculos
se
realizan secuencialmente segn
se
van
introduciendo operadores, en vez de tener que esperar a escribir la expresin al
completo.
Debido
a
esto,
se
cometen
menos
errores
al
procesar clculos complejos.
El proceso de apilacin permite guardar resultados intermedios para un uso
posterior. Esta caracterstica permite que las calculadoras RPN computen
expresiones de complejidad muy superior a la que alcanzan las calculadoras
algebraicas.
No requiere parntesis ni reglas de preferencia, al contrario que la notacin
algebraica, ya que el proceso de apilamiento permite calcular la expresin por
etapas.
En las calculadoras RPN, el clculo se realiza sin tener que apretar la tecla "="
(aunque se requiere pulsar la tecla "Enter" para aadir cifras a la pila).
El estado interno de la calculadora siempre consiste en una pila de cifras sobre
las que se puede operar. Dado que no se pueden introducir operadores en la
pila, la notacin polaca inversa es conceptualmente ms sencilla y menos dada
a errores que otras notaciones.
En trminos educativos, la notacin polaca inversa requiera que el estudiante
comprenda la expresin que se est calculando. Copiar una expresin
algebraica directamente a una calculadora sin comprender la aritmtica dar un
resultado errneo.

Desventajas

La adopcin casi universal de la notacin algebraica en los sistemas educativos


hace que no haya muchas razones prcticas inmediatas para que los alumnos
aprendan la notacin polaca inversa. No obstante, muchos estudiantes afirman
que, una vez aprendida, la notacin polaca inversa simplifica en gran manera el
clculo de expresiones complejas.

Es difcil usar la notacin polaca inversa al escribir a mano, dada la importancia


de los espacios para separar operandos. Se requiere un caligrafa muy clara
para evitar confundir, por ejemplo, 12 34+ (=46) de 123 4+ (=127) o 1 234+
(=235).
Las calculadoras RPN son relativamente raras. Forzado a usar una calculadora
algebraica, el usuario de una calculadora RPN tpicamente comete errores ms
frecuentemente debido a sus hbitos de uso normales. No obstante, esto no es
un problema tan grave en la actualidad, debido a que muchos sistemas
operativos pueden emular calculadoras RPN.