Professional Documents
Culture Documents
3
Captulo
1
....
.,
l'
.-
.---- -
"1
r~1
1
PILAS Y
COLAS
3.1
INTRODUCCiN
3.2,
PILAS
Una pila representa una estructura lineal de datos en la que se puede agregar o quitar
elementos nicamente por uno de los dos extremos. En consecuencia, los elementos de
una pila se eliminan en orden inverso al que se insertaron; es decir, el ltimo elemento
que se mete en la pila es el primero que se saca. Debido a esta caracterstica, se le conoce como estructura LIFO (Last-Input, First-Output: el ltimo en entrar es el primero
en salir).
Existen numerosos casos prcticos en los que se utiliza el concepto de pila; por
ejemplo, una pila de platos, una pila de latas en un supermercado, una pila de libros que
se exhiben en una librera, etctera. En la figura 3.1 se observa una pila de platos. Es de
suponer que si el cocinero necesita un plato limpio, tomar el que est encima de todos,
que es el ltimo que se coloc en la pila.
Las pilas son estructuras de datos lineales, como los arreglos, ya que los componentes ocupan lugares sucesivos en la estructura y cada uno de ellos tiene un nico sucesor y un nico predecesor, con excepcin del ltimo y del primero, respectivamente.
Una pila se define formalmente como una coleccin de datos a los cuales se puede
acceder mediante un extremo, que se conoce generalmente como tope.
76
Captulo 3
PILAS y COLAS
1 11
1 i
'1
3.2.1
presen
Ci
UJ
e pll
Las pilas no son estructuras fundamentales de datos; es decir, no estn definidas corr
tales en los lenguajes de programacin. Para su representacin requieren el uso de otrL
estructuras de datos, como:
Arreglos
Listas
En este libro se utilizarn arreglos . En consecuencia, es importante definir el ta
o mximo de la pila, as como una variable auxiliar a la que se denomina TOPE. ES!variable se utiliza para indicar el ltimo elemento que se insert en la pila. En la figur:
3.2 se presentan dos alternativas de representacin de una pila, utilizando arreglos.
PILA
Representacin de pilas.
MAX
R
PILA
TOPE
111
444
333
222
111
222
333
444
TOPE
MAX
77
MAX
PfLA
MAX
TOPE
333
222
I11
PILA
MAX
R
3
TOPE
PILA
222
111
TOPE = O
a)
b)
el
En la figura 3.3 se presentan ejemplos de a) pila llena, h) pila con algunos elementos y e) pila vaca.
Al utilizar alTeglos para implementar pilas se tiene la limitacin de que se debe
reservar espacio de memoria con anticipacin, caracterstica propia de los arreglos. Una
vez dado un mximo de capacidad a la pila no es posible insertar un nmero de elementos mayor al mximo establecido. Si la pila estuviera llena y se intentara insertar un
nuevo elemento, se producir un error conocido como desbordamiento -overflow-o
Por ejemplo, si en la pila que se presenta en la figura 3.30, donde TOPE = MAX, se
quisiera insertar un nuevo elemento, se producir un elTor de este tipo. La pila est llena
y el espacio de memoria reservado es fijo, no se puede expandir ni contraer.
Una posible solucin a este tipo de inconvenientes consiste en definir pilas de gran
tamao, pero esto ltimo resultara ineficiente y costoso si slo se utilizaran algunos
elementos. No siempre es viable saber con exactitud cul es el nmero de elementos a
tratar; por tanto, siempre existe la posibilidad de cometer un error de desbordamiento
-si se reserva menos espacio del que efectivamente se usar- o bien de hacer uso ineficiente de la memOlia -si se reserva ms espacio del que realmente se necesita-o
Existe otra alternativa de solucin a este problema. Consiste en usar espacios compartidos de memoria para la implementacin de pilas. Supongamos que se necesitan
dos pilas, cada una de ellas con un tamao mximo de N elementos. Se definir entonces un solo arreglo unidimensional de 2 * N elementos, en lugar de dos arreglos de N
elementos cada uno.
Como se ilustra en la figura 3.4, la PILAI ocupar desde la posicin 1 en adelante
(2,3, ... ), mientras que la PILA2 ocupar desde la posicin 2*N hacia atrs (2*N - 1.
2*N - 2, ... ). Si en algn punto del proceso la PILA 1 necesitara ms espacio del ue
realmente tiene -N- y en ese momento la PILA2 no tuviera ocupados sus N lugares.
entonces sera posible agregar elementos a la PILA 1 sin caer en un error de desbord3miento (figura 3.5). Algo similar podra suceder para la PILA2, si sta ne C.eS~
N espacios y la PILA 1 tuviera lugares disponibles (figura 3.5h).
78
Captulo 3
PILAS y COLAS
FIGURA 3.4
PILAl
Representacin de pilas en
espacios compartidos.
PILA2
O=O="'~"'IIJ
2
N+l
2N-l
TOPEl
2N
TOPE2
Otro error que se puede presentar al trabajar con pilas es tratar de eliminar un elemento de una pila vaca. Este tipo de error se conoce cmo subdesbordamiento -UTr
derflow-. Por ejemplo, si en la pila que se presenta en la figura 3.3c, donde TOPE < ~
se deseara eliminar un elemento, se presentara un error de este tipo.
3.2.2
t
t
FIGURA 3.5
Representacin de pilas
en espacios compartidos.
a) PILA1 tiene ms de N
elementos y PlLA2 tiene
menos de N elementos.
b) PlLA2 tiene ms de N
elementos y PILA1 tiene
menos de N elementos.
PILAl
-------=-=::...:..::..------+~
PILA2
0=0=.. IIECIIJ
i
2
2N-l
N+l N+2
TOPEl
2N
TOPE2
PILA2
PILAl
0=0=.. IIIIIIJ
1
a)
N-l
~
TOPEl
TOPE2
N+l
2N-l
2N
b)
3.2
79
Pila_vaca
Pila_llena
Considerando que se tiene una pila con capacidad para almacenar un nmero mximo de elementos -MAX-, y que el ltimo de ellos se indica con TOPE, a continuacin se presentan los algoritmos correspondientes a las operaciones mencionadas. Si la
pila est vaca, entonces TOPE es igual a O.
AIgoritf'1o .
Algoritmo
3.~
Pila_llena
Si (TOPE =MAX)
entonces
Hacer BAND oE- VERDADERO (La pila est llena)
si no
Hacer BAND oE- FALSO (La pila no est llena)
(Fin del condicional del paso 1)
80
Captulo 3
PILAS y COLAS
Algoritmo 3.3
Pone
Algoritmo 3.4
Quita
Ejemplo 3.1
PILA
MAX
PILA
MAX
Jueves
TOPE - - 5
Viernes
Jueves
Mircoles
Mircoles
Martes
Martes
TOPE -
Lunes
Lunes
a)
b)
Una forma de resolver este problema es eliminar primeramente los elementos jueves y
mircoles, de esta manera martes quedara ubicado en la cima de PILA y ahora sera
posible extraerlo (figuras 3.7a, 3.7b y 3.7c).
3.2.3
Aplicaciones de pilas
Las pilas son una estructura de datos muy usada en la solucin de diversos tipos de
problemas, en el rea de la computacin. Ahora se analizarn algunos de los casos ms
representativos de aplicacin de las mismas:
PILA
eliminacin.
_ :e sacar jueves.
:e sacar mir-
MAX
=~desacar
PILA
MAX
PILA
MAX
TOPE-- 3
2
Mircoles
Martes
Lunes
Lunes
TOPE-- 1
a)
b)
Martes
TOPE-- 2
R
Lunes
e)
82
Captulo 3
PILAS y COLAS
t
t
t
t
Llamadas a subprogramas
Recursividad
Tratamiento de expresiones aritmticas
Ordenacin
L amadas a subprogramas
Cuando se tiene un programa que llama a un subprograma, tambin conocido co
mdulo o funcin, internamente se usan pilas para guardar el estado de las variabl
del programa, as como las instrucciones pendientes de ejecucin en el momento que hace la llamada. Cuando termina la ejecucin del subprograma, los valores almacenad
en la pila se recuperan para continuar con la ejecucin del programa en el punto en ~
cual fue interrumpido. Adems de las variables se recupera la direccin del programa
la que se hizo la llamada, porque a esa posicin se regresa el control del proceso.
Supongamos, por ejemplo, que se tiene un programa principal (PP) que llama _
los subprogramas UNO y.DOS. A su vez, el subprograma DOS llama al TRES. Caevez que la ejecucin de uno de los subprogramas concluye, se regresa el control al ni\~
inmediato superior (fig. 3.8).
Cuando el programa PP llama a UNO, se guarda en una pila la posicin en la q
se hizo la llamada (fig. 3.9a). Al terminar UNO, el control se regresa a PP recuperan'
previamente la direccin de la pila (fig. 3.9b). Al llamar a DOS, nuevamente se guarC...
la direccin de PP en la pila (fig. 3.9c). Cuando DOS llama a TRES, se pone en la pi:la direccin de DOS (fig. 3.9d). Despus de procesar TRES, se recupera la posicin'
DOS para continuar con su ejecucin (fig. 3.ge). Al terminar DOS se regresa el con
a PP, obteniendo previamente la direccin guardada en la pila (fig. 3.9j).
Finalmente podemos concluir que las pilas son necesarias en este tipo de aplicacicnes por lo siguiente:
1,
FIGURA J.8
Llamada a subprogramas.
pp
a)
e)
b)
pp
TOPE
pp
TOPE
TOPE=O
el)
3
TOPE
DOS
pp
TOPE
j)
e)
2
pp
TOPE=O
(]
El captulo 4 est dedicado al estudio de la recursividad. Se dejar para entonces la aplicacin de pilas en procesos recursivos.
r a
Captulo 3
PILAS y COLAS
"
Potencia
* /
Multiplicacin y divisin
+ -
Suma y resta
Ejemplo 3.2
Expresin infija: X + Z * W
Expresin posfija: XZW*+
o
1
x+z*w
x+zw*.
xzw*+
85
tal manera que los operandos afectados por l lo precedan. Para el operador de suma se
sigue el mismo criterio, los dos operandos lo preceden. En este caso el primer operando
es X y el segundo es ZW*.
I
:u:in de expresin
s posfija .
(X +Z) * W/T" Y- V
Xl + *W/T" y - V
2
Xl + * W/TY " - V
Xl+ W*/TY" - V
* TY" / -
Xl + W
Xl+ W* TY"/ V-
Conv _postfija
{Este algoritmo traduce una expresin infija -EI- a postfija -EPOS-, haciendo uso de
una pila -PILA-. MAX es el nmero mximo de elementos que puede almacenar la pila}
Hacer TOPE +- O
Mientras (El sea diferente de la cadena vaca) Repetir
Tomar el smbolo ms a la izqujerda de El. Recortar luego la expresin
Si (el smbolo es parntesis izquierdo)
entonces (Poner smbolo en PILA. Se asume que hay espacio en PILA)
Llamar a Pone con PILA, TOPE, MAX y smbolo
si no
Si (el smbolo es parntesis derecho)
entonces
Mientras (PlLA[TOPE] .. parntesis izquierdo) Repetir
Llamar a Quita con PILA, TOPE Y DATO
Hacer EPOS +- EPOS + DATO
86
Captulo 3
PILAS y COLAS
::'.1.
j.
::l
.'It
r.
Cabe sealar que para este algoritmo se maneja la escala de prioridades presentae.
al inicio de esta seccin.
Ejemplo 3.3
En este ejemplo se retoman los casos del ejemplo 3.2 para ilustrar el funcionamiento d::
algoritmo Conv_posfija.
c.)
Expresin infija: X + Z
*W
X+Z*W
X
+z*w
Z*W
*W
W
3
4
XL
+*
XZ
+*
XZW
XZW*
XZW*+
87
operadores de mayor o igual prioridad -la suma tiene menor prioridad que la multiplicacin-, por lo que se agrega el operador * a PILA. En los dos ltimos pasos, 6 y 7, se
extraen de PILA sus elementos, agregndolos a EPOS.
Expresin infija: (X + 2)* W / T 1\ Y - V
Expresin postfija: XZ+W*TYI\NEn la tabla 3.4 se presentan los pasos necesarios para lograr la traduccin deseada,
siguiendo el algoritmo 3.5.
Los pasos que se consideran ms relevantes son: en el paso 5, al analizar el parntesis derecho se extraen repetidamente todos los elementos de PILA (en este caso
slo el operador +), agregndolos a EPOS hasta encontrar un parntesis izquierdo. El
parntesis izquierdo se quita de PILA pero no se incluye en EPOS -recuerde que las
expresiones en notacin polaca no necesitan de parntesis para indicar prioridades-o
Cuando se trata el operador de divisin, paso 8, se quita de PILA el operador * y se
agrega a EPOS, ya que la multiplicacin tiene igual prioridad que la divisin. Al analizar el operador de resta, paso 12, se extraen de PILA y se incorporan a EPOS todos los
operadores de mayor o igual prioridad, en este caso son todos los que estn en ella -la
potencia y la divisin-, agregando finalmente el smbolo en PILA. Luego de agregar a
EPOS el ltimo operando, y habiendo revisado toda la expresin inicial, se vaca PILA
y se incorporan los operadores (en este caso el operador -) a la expresin postfija.
A continuacin se presenta el algoritmo para convertir expresiones infijas a expresiones escritas en notacin prefija.
~~l1Plo 3.4
En este ejemplo se exponen dos casos de traduccin de notacin infija a prefija. El primero de ellos es una expresin simple, mientras que el segundo presenta mayor grado
de complejidad.
Expresin infija: X + Z * W
Expresin prefija: + X*ZW
88
Captulo 3
y COLAS
PILAS
TABLA 3.4
Traduccin de expresin
infija a postfija
(X + 2)* W / T" Y - V
X + 2)* W / T" Y - V
+ 2)* W / T" Y - V
2)* W/T" Y- V
(+
)* W/T" Y- V
(+
*W/T"Y-V
X
X
XZ
XZ+
XZ+
W/T" Y- V
XZ+
/T"Y-V
XZ+W
T" Y- V
"Y- V
10
Y- V
"
/"
11
-V
/"
XZ+W*
XZ+W*
XZ+W*T
XZ+ W* T
XZ+ W* TY
XZ+ W* TY"
12
XZ+W*TY"/
XZ+ w* TY"/
V
13
XZ+W*TY"/V
XZ+W*TY"/V-
14
En la tabla 3.5 se presentan los pasos necesarios para lograr la traduccin desea
Como en el caso de la notacin postfija, ejemplo 3.2, aqu tambin el operador
multiplicacin se procesa primero. De la traduccin de la expresin, paso 1, resulta
operador precediendo a los operandos. Lo mismo para el operador de suma, paso 2.
b)
En la tabla 3.6 se presentan los pasos necesarios para lograr la traduccin desead:.
Lo primero que se procesa en este caso es la subexpresin que se encuentra ent::
parntesis, paso 1. El orden en que se procesan los operadores es el mismo que se sigui
TABLA 3.5
Traduccin de expresin
infija a prefija
Paso
Expresin
X+Z*W
+x*ZW
X+*zw
89
:1
cin de expresin
a prefija
(X + Z)
* W / T" Y -
+XZ*W/T"Y-V
2
*+XZW/"TY-V
/*+XZW"TY-V
para la conversin de infija a posfija. Por tanto, sera reiterativo volver a explicar paso a
paso el contenido de la tabla 3.6. Sin embargo, es de destacar la posicin que ocupan los
operadores con respecto a los operandos: los primeros preceden a los segundos.
A continuacin se incluye el algoritmo de conversin de notacin infija a prefija.
Este algoritmo se diferencia del anterior bsicamente en el hecho de que los elementos
de la expresin en notacin infija se recorrern de derecha a izquierda.
Algontmo 3.)
Conv_prefija
92
Captulo 3
PILAS y COLAS
dad; por tanto, permanecer en PILA hasta el final del proceso de conversin, pas _
Cuando se encuentra un parntesis derecho, paso 9, se agrega directamente a PIL
mientras que cuando el smbolo analizado es un parntesis izquierdo, paso 13, se e
repetidamente cada elemento de PILA agregndolo a EPRE, hasta que se encuentre
parntesis derecho. ste se retira de PILA y no se agrega a EPRE. Cuando ya se
lizaron todos los smbolos de la expresin se procede a quitar de PILA sus eleme
aadindolos a EPRE. Finalmente se invierte EPRE para obtener la expresin en
cin prefija, paso 17. Para evitar el ltimo paso del algoritmo, invertir la expresin.
podran ir concatenando los smbolos en EPRE en orden inverso.
Ordenacin
Otra aplicacin de las pilas se puede ver en el mtodo de ordenacin rpida. Co
tema de ordenacin es ampliamente tratado en el captulo 8, se sugiere remitirse a '
3.2.4
la clase Pila
La clase Pila tiene atributos y mtodos. Los atributos son la coleccin de element~
el TOPE. Los mtodos, por otra parte, son todas aquellas operaciones analizadas e
seccin anterior -Pila_vaca, Pila_llena, Pone y Quita-. En la figura 3.10 se pu
observar grficamente la clase Pila.
Se tiene acceso a los miembros de un objeto de la clase Pila por medio de la n _
cin de puntos. Al asumir que la variable PIOBJ representa un objeto de la clase
previamente creado, se puede hacer:
PIOBJ.Pila_llena para invocar el mtodo que determina si la pila est llena o
En este mtodo no hay argumentos, ya que todos los valores requeridos son miemb
de la clase.
PIOBJ.Pone(argumento) para insertar un nuevo elemento en la pila. En este mtoo..
slo hay un argumento que indica el valor a guardar en la pila; los dems valores requ=
ridos son miembros de la clase.
F GURA 3 J
Clase Pila.
Pila
TOPE = entero
}
Datos = ARREGLO [1..MAX]
Pila_vaca O
Pila_llena O
Pone (argumento)
Quita (argumento)
Nombre de la clase
Atributo,
Mtodos
3.3
3.3
COLAS
93
COLAS
Una cola constituye una estructura lineal de datos en la que los nuevos elementos se
introducen por un extremo y los ya existentes se eliminan por el otro. Es importante
sealar que los componentes de la cola se eliminan en el mismo orden en el cual se
insertaron. Es decir, el primer elemento que se introduce en la estructura ser el que
se eliminar en primer orden. Debido a esta caracterstica, las colas tambin reciben el
nombre de estructuras FIF (First-In, First-Out: el primero en entrar es el primero en
salir).
- RA 3.11
os prcticos
s.
rti P-.
1
l
~'
:"->
v
\
,
-.-
v' ,
94
Captulo 3
PILAS y COLAS
Existen numerosos casos de la vida real en los cuales se usa este concepto. Peejemplo, la cola de los bancos en las que los clientes esperan para ser atendidos -;..
primera persona de la cola ser la primera en recibir el servicio-, la cola de los nio.
que esperan a veces pacientemente para subir a un juego mecnico, las colas de 1 vehculos esperando la luz verde del semforo, las colas para entrar a un cine, teatro'
estadio de ftbol, etctera.
3.3.1
Representacin de colas
Las colas, al igual que las pilas, no existen como estructuras de datos estndar en lo
lenguajes de programacin. Este tipo de estructura de datos se puede representar filOdiante el uso de:
Arreglos
Listas'
Al igual que en el caso de las pilas, en este libro se utilizarn arreglos para fi05trar su funcionamiento. Sin embargo, la implementacin mediante listas es incluso ~
sencilla. El lector puede implementar los algoritmos necesarios para colas, despus ci:
estudiar el captulo que se dedica a la estructura lineal de datos.
Cuando se implementan con arreglos unidimensionales, es importante definir
tamao mximo para la cola y dos variables auxiliares. Una de ellas para que al
cene la posicin del primer elemento de la cola -FRENTE- y otra para que guaro:
la posicin del ltimo elemento de la cola -FINAL-. En la figura 3.12 se muesr::
la representacin de una cola en la cual se han insertado tres elementos: 111, 222 _
333, en ese orden.
El elemento 111 est en el FRENTE ya que fue el primero que se insert; rnien
que el elemento 333, que fue el ltimo en entrar, est en el FINAL de la cola.
FIGL A 3.12
Representacin de colas,
~"'=r=J
1
2
3
MAX
t
t
..
,,~,
FRENTE
FINAL
111
1 +- FRENTE
222
333
3 +- FINAL
MAX
95
.'n de colas,
. b) Cola con
entos. e) Cola
FRENTE = FINAL = O
FRENTE -
111
222
333
111
FRENTE
FINAL
222
333
FINAL
a)
b)
e)
En la figura 3.13, por otra parte, se presentan ejemplos de: a) cola llena, b) cola con
algunos elementos y e) cola vaca.
3.3.2
Las inserciones se llevarn a cabo por el FINAL de la cola, mientras que las eliminaciones se harn por el FRENTE -recuerde que el primero en entrar es el primero en
salir-,
Considerando que una cola puede almacenar un mximo nmero de elementos y
que adems FRENTE indica la posicin del primer elemento y FINAL la posicin del
ltimo, se presentan a continuacin los algoritmos correspondientes a las operaciones
mencionadas.
A1ron''110
96
Captulo 3
PILAS y COLAS
AlgOlitmo 3.8
+-
DATO
Elimina301a
~I
Es posible definir algoritmos auxiliares para determinar si una cola est llena o \ ~
ca. A partir de estos algoritmos se podran reescribir los algoritmos 3.7 y 3.8.
A continuacin se presentan los algoritmos que permiten verificar el estado de
cola, quedando como tarea sugerida la reescritura de los dos algoritmos anteriores.
Algoritmo 3.9
Cola_vaca
97
entonces
Hacer BAND +- VERDADERO
si no
Hacer BAND +- FALSO
2 {Fin del condicional del paso l}
Algoritmo 3 10 Cola_llena
Cola_llena (COLA, FINAL, l\lAX, BAND)
{Este algoritmo determina si una estructura de datos tipo cola est llena, asignando a BAND
el valor de verdad correspondiente. MAX es el nmero mximo de elementos que puede
almacenar COLA}
. Si (FINAL = MAX)
entonces
Hacer BAND +- VERDADERO
si no
Hacer BAND +- FALSO
{Fin del condicional del paso l}
emplo 3.6
Retome el ejemplo 3.1 de la seccin 3.1.2. Se insertan en COLA los elementos: lunes,
martes, mircoles, jueves y viernes -en ese orden-, de modo que la estructura queda
como se muestra en la figura 3.14. Para este ejemplo MAX =7.
COLA
y eliminacin
Lunes
FRENTE
2
Martes
3 Mircoles
FINAL
Jueves
Viernes
7
MAX