You are on page 1of 20
CONTENIDO capituco 7 Pilas: el TAD Pila 7.1. Especificacién formal del tipo abstracto de datos pila. 7.2. Implementacion del TAD Pita con arrays, 7.3. ~ Implementacién de! TAD Pita mediante variables dindmicas. 7.4. Evaluacién de expresiones aritinéticas mediante pilas. RESUMEN. EJERCICIOS, PROBLEMAS, Una pila es una estructura de datos en la que todas las inserciones y climinaciones de elementos se realizan por un extremo denominado cima de la pila. Una analogia es una pila de platos o 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 méximo se debe especificar en tiempo de compilacién. Para resolver este inconveniente, la implementacién de una pila se ha de realizar con punteros (apuntadores). El desarrollo de las pilas como tipos abstractos de datos es tam- bién otro de los motivos centrales de este capitulo. En el mismo se veré cémo utilizar el TAD Pila para resolver problemas de diferentes tipos, Sap ET 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 Ia | ta. 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 Eaneado con Camscanet 208 — Estructura de datos Lifo (Last input first output, «iltimo en entrar, primero en salir»). En la mente se tiene la imagen intuitiva de una pila. As, si nos referimos a una pila de platos, sabemnos que los platos se toman por «arriba», «por la cabezan. En la vida cotidiana se encuentran infini- dad de ejemplos; asi a veces se dice que «apilamos» los libros de un curso... Pila “1000 Las pilas crecen y decrecen dindmicamente, ¢ cuanto a la representacién de una pila utilizand lengua, existen varias formas. Al ser una pila una coleccidn ordenada de clewenten, 1 ser los arrays también una coleccién ordenada de elementos se tiene una faceae rn repre- sentar las pilas. En definitiva, una primera representacién se realiza mediante la estruc- tura estatica array, Una segunda forma de representar una y decrecen dinamicamente, al igual que oc: mica que utiliza punteros y variables dina: TAD Pila son las siguientes: S una estructura de datos dinamica. En o las estructuras de datos que tiene el pila es con listas enlazadas. Las listas crecen urre en una pila. Es una representacign dina. imicas. Las operaciones basicas que definen cl Pilavacia(P) Creaunapila sin elementos. Esvacia(P) Devuelve verdadero si la pila P no tiene elementos Cima (P) Devuelve el elemento que est en la cima de la pila. Suprime(P) Elimina el elemento que esté en la cima de la pila, Sacar(X,P) Devuelve el elemento cabeza y lo suprime. Meter (X,P) Afiade el elemento x en Ia pila, 7.2. IMPLEMENTACION DEL TAD pra CON ARRAYS. Un array constituye el depésito de los elementos dela pila. Elrango del aray debe ser Io suficientemente amplio para poder contener el maximo previsto de elementos de la oi Un extremo del array se considera el fondo de la pila, que permaneceré fio. Lar rant Eaneado con Camscanet Pilas:elTAD Pita 209 indice del array que contiene el elemento cima, Las declaraciones, procedimientos y funciones para representar el TAD pila forman parte de la unidad pilas, const, Maxelems = 100; (Dependeré de cada realizacién) type Indicepila = 0..Maxelems; Tipoelemen (Tipo de los elementos de la pila) Tipopila = record Eleme: cab end; os: array(1 Maxelens} Indicepila of Tipoelemen; En funcidn de esta representacién se codifican las operaciones basicas definidas en TAD pila: Pilavacia, Esvacia, Cima, Suprimir, Sacar, Meter y Pilallena. Pilavacia(P) procedure Pilavacia(var P: Tipopila); begin P.Cab: ena; ° Eavacia(P) function Esvacia(P begin Esvacia end; Tipopila): boolean; P.Cab=0 cima(P) Esta funcién devuelve el elemento cabeza dela pila, sin modificar la pila. function cima(P: ‘Tipopila): Tipoelemen begin Af not Esvacia(P) then Cima := P.Elementos(P.cab) ena; Suprime(P) Esta operacién elimina el elemento cabeza, modificando la pila, Procedure Suprime(var P: Tipopila); begin Af not Esvacia(P) then P.Cab:= P.cab- 1 end; Eaneado con Camscanet 210 Estructura de datos Sacar(X, P) Esta operacién devuelve el elemento cabeza y lo suprime. Procedure Sacar(var X:Tipoelemen; var P:Tipopila); begin if not Esvacia(P) then with P do begin X:= Blementos(Cab}; Cab:= Cab- 1 ena end; Meter (x, P) Esta operacién afade el elemento x a la pila. Cuando se afiade un elemento se dice que éste es empujado dentro de la pila. AJ estar representando la pila mediante una estructura estatica’ puede ocurrir que no haya posiciones libres en el array. Por esta circunstancia se ha de incorporar una opera- cién Pl lena que devuelve verdadero si se ha alcanzado el niimero méximo de elemen. tos previstos. function Pllena(P: Tipopila): boolean, P.Cab=Maxelems procedure Meter(X: Tipoelemen; var P: Tipopila) begin if mot Pllena(P) then with P do begin Cab:= Cabs 1; Elementos [Cab] := x ena end; PROBLEMA 7.1. Utilizacién de una pila Se desea invertir una cadena de caracteres y se trata de determinar si han sido inverti- dos correctamente dichos caracteres. Para ello se lee la cadena de caracteres; a conti- nuacién, en la siguiente linea los caracteres de la cadena invertidos, La estrategia a seguir es sencilla, los caracteres de la cadena se almacenan en una pila. Segiin se van leyendo los caracteres de la cadena invertida sé comparan con el cardcter cima de la pila; de este modo se aprovecha la principal caracteristica de una Eaneado con Camscanet Pilas: el TAD Pita 211 pila: ultimo en entrar primero en salir, El tltimo cardcter introducido debe ser igual que cl primer cardcter de la cadena invertida. function Esinversa: boolean; var ch: char; Pila: Tipopila; Inv: boolean; begin Pilavacia(Pila); writeln(‘Caracteres de la cadena: '): repeat read(Ch) ; Meter(ch, Pila) until eoln; readin; (Los caracteres leidos son comparados con 1a pila} Invi= true wnile not Esvacia(Pila) and Inv do begin readiCh) vis Ch= Cima(Pila); Suprimir(Pila) iderames que ei hay més caracteres que en la pila, no ha sido invertida correctamente) Esinversa:= Inv and eoln; readin end; Para sacar los elementos de Ja pila se puede seguir la alternativa de utilizar otra va- riable cardcter D y Ia operacién Sacar: while not Esvacia(Pila) and Inv do begin read(ch) Sacar(D, Pila) Inv:= Ch = D; endy 7.3. IMPLEMENTACION DEL TAD PrLa MEDIANTE VARIABLES. DINAMICAS La implementacién dindmica de una pila se hace almacenando los elementos como nodos de una lista enlazada, con la particularidad de que siempre que se quicra meter (empu- Jar) un elemento se haré por el mismo extremo que se extraerA Esta realizacién tiene la ventaja de que el tamafio se ajusta exactamente a los ele- mentos de la pila. Sin embargo, para cada elemento es necesaria més memoria, ya que hay que guardar el campo de enlace. En la realizacién con arrays hay que establecer un maximo de posibles elementos, aunque el acceso es mas rapido, ya que se hace con una variable subindicada. amend con Comscnner 212 Estructura de datos (er eee Pla Los tipos de datos y operaciones en la realizacién con listas son muy similares a los ya expuestos en listas enlazadas Pilavacia, Esvacia, Cima, Suprime, Sacar y Meter type Tipoelene! (Tipo de los el Ptrpla= “NodoPia; Nodopla- record Elemento: Tipoelemen Enlace: PtrPla end; mentos de la pila) Pilavacia(crear pila) Crea una pila sin elementos. procedure Pilavacia(var Pila: Ptrpla) begin Pila ena; Ravacia Funcién que determina si la pila no tiene elementos. function Esvacia(Pila: perpla begin Esvacia end; boolean; Pila= nil cima (Pia) Devuelve el elemento cabeza de la pila, sin modificar la pila, Eaneado con Camscanet xcaneado con Camseanner 214 Estructura de datos begin 4f not Esvacia(Pila) then with Pila* do begin Pila; Elemento; Enlace; dispose(Q) end end; El procedimiento se puede escribir liamando a Cima y Suprimir, procedure Sacar(var xX: begin Xt= Cima(Pila); Suprime(Pila) end; ipoelemen; var Pila: ptrpla); Meter(X, Pila) Esta operacién aiiade el elemento x a la pila. En esta representacién con estructuras dindmicas no tiene sentido la operaci6n pila lena, la pila crece 0 decrece segiin lo nece. sita. Pita nil procedure Meter (x: Tipoelemen; var Pila: Ptrplal: var Q: Ptrpla; begin new(Q); Q*. Element: Q*.Enlace:= Pila; Pila:= 0 end; Eaneado con Camscanet Pilas:e\TADPila 215 7.4. EVALUACION 2 MEDIANTE PILAgexPRESIONES ARITMETICAS R= X*Y ~ (aya) éstd escrita de la forma habitual: el operador en medio de los operando. Se conoce como notacién infija. Conviene recordar que las operaciones tienen distintos niveles de prece- dencia, Paréntesis O nivel mayor de prioridad Potencia Me Multipl/division : *,/ y Suma/Resta +,- nivel menor de prioridad También suponemos que a igualdad de precedencia son evaluados de izquierda a derecha 7.4.1, Notaciones Prefija (Polaca) y Postfija (Polaca inversa) La forma habitual de escribir operaciones aritméticas es situar el operador entre sus dos operandos con la citada notacion infija, Esta forma de notacién obliga en muchas oca- siones a utilizar paréntesis para indicar el orden de evaluacién. ASB/ (ASC) ASB/AsC Representan distintas expresiones al no poner paréntesis. Igual ocurre con las expre- siones (ap A-B-CuD La notacién en la que el operador se coloca delante de los dos operandos, notacién Prefija, se conoce como notacién polaca (en honor del matematico polaco que la estudi6) ASB/(ASC) (infija) — A*B/+AC + *AB/+AC 3 /*ABSAC (polaca) BAB/AsC (infija) — *AB/A+C > /*ABA+C > +/+ABAC (polaca) (A-B)*C4D (infija) + -AB~c+D 4 ~-ABC+D — +*-ABCD “(polaca) Podemos observar que no es necesario la utilizacin de paréntesis al escribir la ex- Presion en notacidn polaca. La propiedad fundamental de la notacién polaca es que el orden en que se van a realizar las operaciones est determinado por las posiciones de los operadores y los operandos en la expresién. amend con Comscnner 216 Estructura de datos Otra forma de escribir las operaciones es mediante la notacién postfija 0 polaca in. versa que coloca el operador a continuacién de sus dos operandos. ATB/(A+C) (infija) — A*B/AC+ 3 AB*/AC+ > AB*AC+/ (polaca inversa) ASB/A¥C, (infija) + ABY/A+C 4 AB*A/+C > AB*A/C+ (polaca inversa) (A-B)*C+D (infija) 3 AB-*C+D + AB-C*+D AB-C*D+ (polaca inversa) 7.4.2. Algoritmo para evaluacién de una expresi6n aritmética A la hora de evaluar una expresién aritmética escrita, normalmente, en notacién infija la computadora sigue dos pasos: 12 Transformar la expresién de infija a postfija, 2.° Evaluar la expresion en posttija. En el algoritmo para resolver cada paso es fundamental la utilizacién de pilas Se parte de una expresién 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ém, *, /, + 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 expresion en postfija. Los operadores se meten en la pila siempre que esta esté vacia, o bien siempre que tengan mayor prioridad que el operador cima de Ia 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 postija, 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 ng hay mas ny la pila esté vacia. Sea por ejemplo la expresién infijajA* (B+C- (D/E*F) -G ja se va ir formando con la siguiente secuenci H] la expresion en postfi- Expresin Estado de la Pila aA Cardcter A a la expresin; caracter * a la pila. AB Caracter ( a la pila; cardcter B a la expresién. ape Cardcter +a la pila; carécter C a la expresién. En este momento el estado de la pila es Ef iC * 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: C * y la expresion es: ABC ABCD Cardcter ( a 1a pila; cardcter D a la expresi6n: ABC+DE Cardcter / a la pila; cardcter E a la expresi6n. ABC+DEF Caracter “a la pila; eardcter F ala expresion, ; Cardcter ) (paréntesis derecho) provoca vaciar Ia pila hasta un (. La pila en este momento contiene / ( ( EI nuevo estado de la pila es C y la-expresin ABC+DEF*/ ABC+DEF*/~ Cardcter ~ a la pila y se extrae a su vez ~; ABC=+DEF~/-c Cardcter 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 — ABC+DEF*/-G-+H Cardcter H se lleva a la expresion Fin de entrada, se vacia la pila: ABC+DEF~/ ABC+DEF*/-G-*H- En la descripcién realizada se ob: prioridad fuera de la pila, es decir, en de la pila la prioridad es minima. D serva que el paréntesis izquierdo tiene Ia maxima a notacién infija; sin embargo, cuando esta dentro e igual forma, para tratar el hecho de que varios Operadores de potenciacién son evaluados de derecha a izquierda, este operador tends rete proridad cuando todavia no esté metido en la pila que el mismo pero metido en Ia pila. Las prioridades son determinadas segiin esta tabla: amend con Comscnner 218 Estructura de datos ome Priorliad- dentro pila | Prioridad fuera pila 3 ae 2 a4 1 1 0 s Obsérvese que no se trata el paréntesis derecho ya que éste provoca sacar bam de Ia pila hasta el paréntesis izquierdo. El algoritmo de paso de notacién infija a postfija 1. Obtener caracteres de la expresién y repetir los pasos 2 al 4 para cada caricter. 2. Si es operando, pasarlo a la expresién postfija. 3. Sies operador: ila esti vacia, meterlo en Ia pila. Repetir a partir de 1 a pila no esté vacia Si la prioridad del operador leido 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 expresi6n postfija, vol- ver a3, 4. 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 5. Si quedan elementos en la pila pasarlos a la expresi6n postfija, 6. Fin del algoritmo. 7.5. 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 Pilaop y ExpPost. 7.5.1. Unidad Pilaop La unidad Pilaop contiene los tipos basicos para el manejo de las pilas, asi como sus operaciones asociadas. unit Pilaop; interface type Plaopr = ~Nodopr: Nodopr= record Eaneado con Camscanet xcaneado con Camseanner xcaneado con Camseanner Pllas:elTADPila 224. case Op of Pép r= t/t: Pep Ptp ena (En este procedimien Fi Cardctes ag gdkmiento se lee la expresién en notacién infija. Et Ea expecsdg, SmPitrarianente determina ei fin de 1a expresién ¢5 ¥ en postfija es almacenada en el vector Ar) procedure Post fija(var Ar Tag; var J: integer); P: Plaopr It, Ch: char; Desapila: boolean; begin chi= Tis 0; Perear (P) while Ch <> '#' Yo begin repeat, read (Ch) ; Ch: =upcase (ch) until valido(ch); if operando(Ch) then (Pasa directamente a la expresién postfija) begin Je= Tehs Ar (J]-oprdor:=false; Ar(g].C:= Ch ena else if Ch<>'#' then (es operador) df ch <> ')' then begin desapila:=true; while desapila do if Pvacia(P) or (P£a(Ch)> Pdp(P)) then begin Pmeter (Ch, P); desapila := false end else if Pfd(ch)< Pdp(P) then (hay que dasapilar) begin Psacar(It, P); Jie Sh; Ar[J].C:= Its (Ar en postfija) Ar(J].oprdor := true ond end else begin (es un ')' ) Poacar(It, P); repeat Yes Tel; ar[j].cr=2t; Ar(J] .oprdor:=true: Eaneado con Camscanet xcaneado con Camseanner Pilas:elTAD Pita 223 function Povacia(F: Plaopdos ): boolean; procedure Pocrear(var P: Plaopdos ); Procedure Pometer(var P: Plaopdos ;Ch char) ; procedure Posacar(var p: h Plaopdos ;var ch: char); function Pocima(P: Plaopdos): char, {devuelve el elemento cima de la pila} Procedure Poborrar(var P: Plaopdos ); (Fin de la secciénde interface. La seccién inpleméntation es tgual que en la unidad Pilaop) Ahora ya se puede escribir el programa completo que realiza todo el proceso. El programa Evalua_Expresion utiliza las unidades Crt, ExpPost y PilaOpdos; contiene el procedimiento Leer_oprdos que lee el valor numérico de los operandos, asi como el procedimiento Evalua que implementa el algoritmos de evaluaci6n. program Evalua, xt, ExpPost, Bilaopdos; presion; Vv: Oprdo: Tag I, J:intege: valor: real; procedure Leer_oprdos(E:Tag;N:integer; var V: Oprdos); (gn este procedimiento se asignan valores numéricos a los operandos} var K: integer; ch: char; begin Kie 0; repeat Kis Kel; 4£ not E[K].Oprdor then (Bs un operando, peticién de su valor numérico) E(K]-¢ write(ch, ' readin(Vich]) end until K=N end; ae procedure Evalua(Pf: Tag; N: integer; Oper: Oprdos; Var Valor: real); Pila: Plaopdos; I: integer; Numi, Num2: real; Op: chai begin Tis 0; Pocrear (Pila) ; Eaneado con Camscanet 224 — Estructura de datos Ag not Pf(I].Oprdor then Pometer(Oper(P£(I].C], Pila) else if Pf(I}.Oprdor then begin Posacar(Num2, Pila): Posacar(Num1, Pila); case Pf[I].C of oe Exp (Numi *Ln(Num2)) {Potencia) Numi *Num2 Numi /Num2; Numl+Num2; Num1-Num2 mye end; Pometer (Valor, Pila} elrscr; weiteln('Expresién aritmética(termina #)"); Postfija(T, 3); writeln(‘Asignacién de valores numéricos a los operandos’); writeln ; Leer_oprdos(?, 3. Vii Evalua(T, J, V, Valor); writeln; Write( Resultado de evaluacién de la expresién: ', valor); end. RESUMEN Una pila es una estructura de datos tipo LIFO (last-in-frst-out, iltimo en entrariprimero en salir) cen la que los datos se insertan y eliminan por el mismo extremo, que se denomina cima de la pila El proceso de insercién se denomina meter © poner y el de eliminacién se denomina extraer quitar 0 sacar. ‘ ‘Abadir un elemento a una pila se llama operacién meter 0 poner (push) y eliminar un ele- mento de una pila es la operacién extraer, quitar 0 sacar (pop). ‘El intento de poner un elemento en una pila Ilena produce un error conocido como desborda- miento dela pila (stack over Low). El intento de sacar un elemento de una pila vacia produ- ve un error conocido como desbordamiento negativo de la pila (stack underflow). ‘Una pila puede ser implementada mediante un array o mediante una lista enlazada. Una ven~ taja de una implementacin de una pila mediante una lista enlazada sobre un array es que, con la Tora enlazada no existe limite previo en el nimero de elementos o entradas que se pueden afiadir ala pila. Pa ilamadas a procedimientos recursivos se implementan utilizando una pila (de hecho, to- das iar llamadas a procedimientos, sean ono recursivas, se implementan wtilizando wna pila) EITAD pia, al igual que el TAD Lista y TAD Cola son, posiblemente, os tipos abstrac- tos de datos ms utlizados en la gestién de proyectos software, dado que la estructura tipo pila es toby freeente en numerosos problemas de tratamiento de informacion, asf como en problemas rie miticos, estadisticos o financieros. Por ejemplo, se puede utilizar una pila para determinar si Pilas:el TAD Pila 225 una secuencia de vuelos existe entre dos ciudades. La pila mantiene la secuencia de ciudades Visitadas y permite a un algoritmo de busqueda volver hacia atrés. Para ello se sitia la ciudad origen en la parte inferior de la pila, y la ciudad destino en la parte superior, con lo que las suce- sivas ciudades de trinsito se van colocando en la secuencia correcta. EJERCICIOS 7.1, Se desea implementar el TAD pila de tal forma que Jos elementos de la pila sean almacena- dos en una lista circular. El puntero extemo a Ia lista apunta al elemento cabeza, Escribir las operaciones de meter, cima, suprimir y esvacia. 7.2, Supongamos que estamos trabajando en un lenguaje de programacién que no tiene el tipo de dato puntero. Se plantea la resolucién de un problema utilizando dos pilas de nimeros reales. Las dos pilas se quiere guardar en un tinico array, de tal forma que crecen en sentido contrario, una de ellas crece desde la posicién I del array y Ia otra desde la ultima posicién del array. Escribir la estrategia a seguir para esta representacién, variables necesarias para contener la posicién del elemento cabeza de ambas pilas. 7.3. Dada la representacién de dos pilas propuesta en 7.2, escribir el algoritmo de la ‘operacién CreaPila(Pilal, Pila2) que inicializan ambas pilas como pila vacia. De igual for- ma escribir las funciones Esvacial y Esvacia2 que determinan si las respectivas Pillai y Pila2 estén vacias, 7.4. Completar las operaciones de las pilas propuestas en 7.2: Meter1, Meter2 y Supri- mel, Suprime2. En las operaciones hay que tener en cuenta condiciones de error, 7.5. Utilizando una pila de caracteres, hacer un seguimiento para transformar la siguiente ex- presién infija a su equivalente expresion en postfija, Ez (XY/Z*W+(¥-Z)V 7-6 Aplicando el algoritmo de evaluacion de una expresién, obtenga el resultado de las si- guientes expresiones escritas en postfija. © XY+Z-YX+Z— © XYZ+*ZYX-+* para X=1, Y=3, PROBLEMAS 7-1. Escribir un programa para determinar si frases (cadenas) son palindromos, Utilizar para cllo el TAD pila de caracteres realizado en una unidad. La entrada de datos son las frases y {a salida la propia frase junto a laetiqueta «ES PALLNDROMO», obien «NO ES PALIN. DROMO», 7-2. Escribir un programa que convierta expresiones escritas en notacién infija (forma habitual) @ notacién postfija. Cada expresién se encuentra en una linea, el programa ha de terminar cuando la linea conste de 3 asteriscos. Escribir un programa que convierta expresiones escritas en notacién postfija a notacién infija. Cada expresién se encuentra en una linea, el programa ha de terminar cuando la linea conste de 3 asteriscos. Eaneado con Camscanet 226 1.4, a 1.6. a 18. 19. pl coD Estructura de datos Escribir un programa que convierta expresiones escritas en notacién postfija a notacién prefija. Cada expresién se encuentra en una linea, el programa ha de terminar cuando Ja linea conste de 3 asteriscos. Un mapa de carreteras podemos representarlo mediante la matriz simétrica MM de N x N elementos enteros, donde los valores / a N representan los pueblos/ciudades que aparecen en el mapa Los elementos de la matriz son tales que MiM(i,j) = 0 si no hay conexién directa entre el pueblo i y el pueblo j. MM(i,j) = d si hay conexién directa entre el pueblo iy el pueblo, y su distancia es d. Con esta representacién del mapa queremos escribir un programa que simule el mapa des- crito y que tenga como entrada dos pueblos (origen, destino) entre los que no hay conexién directa; decida si hay un camino que pase por los pueblos del mapa y determine la distancia de ese camino, Utilizar una pila para ir almacenando los pueblos que van formando el ca- mino recorrido y poder volver atras si se alcanza un pueblo desde el que no se puede prose- guir la ruta, y probar con otra ruta. Utilizando tinicamente las operaciones basicas sobre pilas: Meter, Cima, Suprime y Esvacia, construir las operaciones que realicen las siguientes acciones: a) Asignar a X el segundo elemento desde la parte superior de la pila, dejando Ia pila sin sus dos elementos de la parte superior. 5) Asignar a X el segundo elemento desde la parte superior de la pila, sin modificarla. ©) Dado un entero positivo n, asignar aX el n-ésimo elemento desde la parte superior de la pila, dejando la pila sin sus n elementos de la parte superior. d) Dado un entero positivo m, asignar aX el n-ésimo elemento desde la parte superior de la pila, sin modificarla, e) Asignar a X el elemento fondo de Ja pila, dejando la pila vacia, Jf) Asignar aX el elemento fondo de la pila, sin modificarla Utilizando las operaciones del TAD pila, escribir una operacién de copia, tal que devuelva la copia de una pila. Escribir una funcién para determinar si una secuencia de caracteres de entrada es de [a forma: KEY Donde x es una cadena de caracteres, e ¥ es la cadena inversa, siendo & el rador, Escribir una funcidn para determinar si una secuencia de caracteres de entrada es de la forma: | cardcter sepa- AtBHCH Donde cada una de las cadenas A, B, C ... son de la forma X & Y, que a su vez estaran separadas por el cardcter #. amend con Comscnner

You might also like