CONTENIDO
CAPITULO 7
Pilas: el TAD Pila
7.1. Especificacién formal del tipo abstracto de datos Pita.
7.2. Implementacién del TAD Pia con arrays.
7.3. _Implementacién del TAD Pila mediante variables dindmicas.
7.4. Evaluacién de expresiones aritméticas mediante pilas,
RESUMEN.
EJERCICIOS.
PROBLEMAS.
Una pila es una estructura de datos en la que todas las inserciones y
eliminaciones de elementos se realizan por un extremo denominado
cima de la pila, Una analogia es una pila de platos 0 una pila de cajas.
La implementacién de una pila se puede realizar mediante arrays 0
con punteros. El inconveniente de la implementacién de una pila con
un array es que su tamafio maximo se debe especificar en tiempo de
compilacién. Para resolver este inconveniente, la implementacion de
una pila se ha de realizar con punteros (apuntadores).
El desarrollo de las pilas como tipos abstractos de datos es tam-
bign otro de los motivos centrales de este capitulo. En el mismo se
vera cémo utilizar el TAD Pila para resolver problemas de diferentes
tipos.
7.1. ESPECIFICACION FORMAL DEL TIPO ABSTRACTO
DE DATOS PILA
Una pila es una lista ordenada de elementos en la que todas las inserciones y supresio-
nes se realizan por un mismo extremo de la lista, En una pila el ultimo elemento afiadido
es el primero en salir de la pila, Por esa razén a las pilas, se las denomina también listas
207216 Estructura de datos
Otra forma de escribir las operaciones es mediante la notacién postfija o polaca in-
versa que coloca el operador a continuacién de sus dos operandos.
AMB/(AsC) (infija) + A*B/AC+ + ABt/AC+ > AB*AC+/ (polaca inversa)
AMB/AsC | (infija) 9 AB*/A¥C > ABYA/+C > ABYA/C+ (polaca inversa)
(a-B)7C+D (infija) 9 AB-*C+D 9 AB-C*+D + AB-C*D+ (polaca inversa)
7.4.2. Algoritmo para evaluacién de una expresién aritmética
A Ia hora de evaluar una expresi6n aritmética escrita, normalmente, en notacién infija la
computadora sigue dos pasos:
1° Transformar la expresién de infija a postfija.
2° Evaluar la expresién en posttija.
En el algoritmo para resolver cada paso es fundamental la utilizacién de pilas.
Se parte de una expresi6n en notacién infija que tiene operandos, operadores y pue-
de tener paréntesis. Los operandos vienen representados por letras, los operadores
van a ser:
(potenciacién), *) sy, 4, ~
La transformacién se realiza utilizando una pila en la que se almacenan los operado-
res y los paréntesis izquierdos. La expresién se va leyendo cardcter a cardcter, los ope
randos pasan directamente a formar parte de la expresién en posttfija.
Los operadores se meten en la pila siempre que esta esté vacia, o bien siempre que
tengan mayor prioridad que el operador cima de la pila (0 bien igual si es la maxima
prioridad). Si la prioridad es menor o igual se saca el elemento cima de la pila y se
vuelve a hacer la comparacién con el nuevo elemento cima.
Los paréntesis izquierdo siempre se meten en la pila con la minima prioridad. Cuan-
do se lee un paréntesis derecho, hay que sacar todos los operadores de la pila pasando a
formar parte de la expresion postfija, hasta llegar a un paréntesis izquierdo, el cual se
elimina, ya que los paréntesis no forman parte de la expresién postfija.
El algoritmo termina cuando no hay mas items de la expresin y la pila esté vacia.
Sea por ejemplo la expresi6n infija A* (B+C- (D/E*F) ~G) ~H, la expresién en postti-
ja se va ir formando con la siguiente secuencia:
Expresién Estado de la Pila
a Caricter A a la expresion; cardcter * a la pila.
ae Caracter ( a la pila; cardcter B a la expresin.
apc Cardcter + a la pila; cardcter C a la expresion,
En este momento el estado de la pila es
+
(ABCs
ABC+D
ABC+DE
ABC+DEF
ABCHDEF*/
ABCHDEF*/~
ABCDEF*/-G
ABCYDEF*/-<-*
ABCDEF*/~G-*H
ABC+DEF*/-G-*H-
Pilas: el TAD Pila 217
El nuevo cardcter leido es «-», que tiene igual prioridad que el ele-
mento cima de la pila «+»; en consecuencia, el estado de la pila es:
LJ
y la expresién es:
Cardeter (a la pila; cardcter D a la expresién.
Cardcter / a la pila; cardcter E a la expresion.
Caracter * a la pila; cardcter F a la expresién,
Caracter ) (paréntesis derecho) provoca vaciar la pila hasta un (.
La pila en este momento contiene
/
(
(
El nuevo estado de la pila es
LJ
y la expresién
Cardcter ~ a la pila y se extrae a su vez -;
Caracter G a la expresién; cardcter ), son extraidos
de la pila los operadores hasta un ( la pila queda
Cardcter , se saca de la pila * y se mete —
Caracter H se lleva a la expresion
Fin de entrada, se vacia la pila:
En la descripcién realizada se observa que el paréntesis izquierdo tiene la maxima
prioridad fuera de la pila, es de
en la notacién infija; sin embargo, cuando esta dentro
de la pila la prioridad es minima. De igual forma, para tratar el hecho de que varios
operadores de potenciacién son evaluados de derecha a izquierda, este operador tendra
mayor prioridad cuando todavia no esté metido en la pila que el mismo pero metido en la
pila. Las prioridades son determinadas segiin esta tabla:218
Estructura de datos
Operador | Prioridad dentro pita | Prioridad fuera pila
a 3
“I 2
* 1
0
“
Obsérvese que no se trata el paréntesis derecho ya que éste provoca sacar operadores
de la pila hasta el paréntesis izquierdo. El algoritmo de paso de notacién infija a postfija:
1
3.
7.5.
Obtener caracteres de la expresién y repetir los pasos 2 al 4 para cada cardcter.
Si es operando, pasarlo a la expresién postfija.
Si es operador:
3.1. Si pila esta vacia, meterlo en la pila. Repetir a partir de 1.
3.2. Sila pila no esta vacia:
Si la prioridad del operador lefdo es mayor que la prioridad del operador
cima de la pila, meterlo en la pila y repetir a partir de 1,
Si la prioridad del operador es menor o igual que la prioridad del opera-
dor de la cima, sacar cima de la pila y pasarlo a la expresién postfija, vol-
ver a3.
Si es paréntesis derecho:
4.1. Sacar cima de pila y pasarlo a postfija.
4.2. Si nueva cima es paréntesis izquierdo, suprimir elemento cima.
4.3. Si cima no es paréntesis izquierdo, volver a 4.1.
4.4. Volver a partir de 1
Si quedan elementos en la pila pasarlos a la expresién postfija.
Fin del algoritmo.
APLICACION PRACTICA DE LA EVALUACION
DE UNA EXPRESION ARITMETICA
Los tipos de datos, procedimientos y funciones utilizados para codificar el algoritmo
tratado en el apartado anterior se realiza en las unidades Pi laop y ExpPost.
7.5.1.
Unidad Pilaop
La unidad Pi1aop contiene los tipos basicos para el manejo de las pilas, asi como sus
operaciones asociadas.
unit Pilaop;
interface
type
Plaopr = *Nodopr;
Nodop!
recordInfo: char;
Sgte: Plaopr
ends
function Pyacia(?
procedure Prear(var P
procedure Pmeter (c!
procedure Psacar(var ch
implementation
function Pvacia(P:
begin
Pvacia:= P
ond;
procedure Pere:
begin
ea
ret
procedure Pneter (ch:
Plaopr;
begin
new (A) 7
An vInfo r= Ch
At.sgte := p;
Pisa
ends
procedure Psacar(var Ch
begin
Ch:= Peima(P)
Pborrar (P)
end;
function Pcima(P:Plaopr) :char;
begin
4£ not
Peima:=
Pvacia(P)
P*.Info
then
procedure Pborrar(var P
A: Plaopr ;
begin
if not pvacia(P)
begin
then
sate;
dispose (a)
end;
end:
end.
Plaopr
Plaopr)
char:
char;
function Pcina(?:Plaopr) :char;
procedure Pborrar(var P:
Plaopr)
Pilas: 6! TAD Pita
): boolean;
var P: Plaopr);
var P: Plaopr);
{devuelve el elemento cima de la pila
Plaopr);
boolean;
Plaopr);
Plaopr) ;
char; var P: Plaopr);
{devuelve elemento cima de la pila}
Plaopr +220 Estructura de datos
7.5.2. Unidad ExpPost (transformacion a postfija)
La unidad ExpPost realiza la transformacion de la expresi6n infija a postfija, utilizan-
do para ello la unidad Pilaop definida anteriormente.
unit ExpPost;
interface
uses crt, Pilaop;
type
Treg= record
C: char;
Oprdor: boolean
end;
Tag array[1..100] of Treg;
{Tipo para almacenar la expresidén}
Oprdos = array['A'..'Z'] of Real;
{para evaluar la expresidén}
function Valido(C: char): boolean;
function Operando(C: char): boolean;
function Pdp(P: Plaopr ): integer;
function Pfp(op: char): integer;
procedure Postfija(var Ar: Tag; var J: integer);
implementation
function Valido(C: char): boolean;
begin
Valido:= C in ['A'..'Z',tat..tzt, Tot t/t tet ttt tat tet (ty ty]
end;
function Operando(C: char): boolean;
begin
Operando:= C in ['A'..'Z','a'..'z']
end;
{Prioridad del operador dentro de la Pila}
function Pdp(P: Plaopr ): integer;
var
op: char;
begin
if not Pvacia(P) then
begin
OP:= Pcima(P);
case op of
'*': Pdp:= 3;
Ve 7 Pdp =" 27
oy ap ePO pee: =sely;
'(': Pdp sien
end
end
else {Pila estA vacfa, es asignada la minima prioridad}
Pdp:= -1
end;
{Prioridad del operador en la expresién infija}
function Pfp(Op: char): integer;
begin