Está en la página 1de 20
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 207 216 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! record Info: 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

También podría gustarte