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.
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.
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.
#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:
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
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