Operación unión de pilas en Pascal

Iniciado por lolaiza, 23 Abril 2018, 23:26 PM

0 Miembros y 1 Visitante están viendo este tema.

lolaiza

Hola, me pide en un ejercicio que cree dos pilas Z y Q y que  calcule en una pila X la operación de unión.
¿Alguien me puede explicar que es?

Serapis

#1
Yo te oriento, luego pones de tu parte y lo trasladas a código (además Pascal lo tengo muy oxidado).

Es fácil que los estudiantes confundan pilas con colas. Así que cuanto antes encuentre uno una manera de disnguirlas mejor.
Con una cola, como su nombre indica, podemos fijarnos en la cola del cine... el último que llega se pone a la cola y espera hasta que el toque.
En un pila, es como 'apilar' libros en el suelo... pones uno encima de otro, luego el último en 'llegar' es el primero en salir... los de habla inglesa como les molan tanto las abreviaturas las llaman por eso FILO y FIFO respectivamente (que parece el mote de profes de mates), First In, First Out y First In, Last Out
Igualmente alguien pudo pensarlo al revés y llamarlas
Last In, Last Out (LILO) y Last In, First Out (LIFO)...  :laugh: :laugh: :laugh:

Bueno, pués si tienes dos pilas, imagina dos montones de libros, cómo pasarías un 'montón' al otro?


Procedmiento Amontonar(pila origen p1, pila destino p2)
   Mientras p1.Items  // Quedán libros en el montón1?, si sí, entonces...
       r = p1.pop  // Toma un libro del montón1 y ponlo en tu mano
           // Toma: no cualquiera, sino el que está arriba del todo.
       p2.push r   // deposita en el monton2, el libro que tienes en la mano.
           // Deposita: no en cualquier parte, si no encima del todo.
   Repetir
fin procedmiento


Bien, el ejercicio previo fue fácil, pués el que te piden es repetir lo mismo primero con una pila y luego con la otra...

Procedimiento Amontonar2Pilas(pila Z, pila Q, pila X)
   Amontonar (Z, X)
   Amontnar (Q, X)
fin procedimiento


Quizás la pila X esté vacía y deba crearse dentro del propio procedmiento y luego ser devuelto... eso ya es sazonar al gusto...



p.d.:
Realmente de este modo se mueven muchos elementos. Si se trata de que el estudiante practique vale, pero no es eficiente.
Cuando se trata de ser eficiente, si dos pilas íntegramente pasan a formar parte de otra, hay que mirar si la propia pila dispone de métodos propios, para enlazar el principio de un montón con el final del otro, así la unión de 2 pilas, solo supone operar con dos nodos. Clocando el primer nodo de una pila detrás del último de la otra pila...

lolaiza

Gracias!!!!

Entonces la operación de unión es poner ambas pilas en una???

Serapis

#3
Perdona, me dejé llevar más por el título...
1 - Informalmente unión, significa reunión... siendo éste caso, todo lo escrito, sería totalmente correcto.

2 - Formalmente, el concepto de Unión 'U', significa "pertecenece a", así: rojo U colores
indica que rojo pertenece al conjunto colores.
En resumen es lo mismo con la salvedad de que no ha de contener elementos repetidos (el conjunto colores, no contiene: verde, azul, rojo, amarillo, blanco, rojo... es decir solo hay una copia de cada uno).

Releyendo que es un ejercicio (posiblemente de un profesor), asumo que será lo segundo.
Aunque la diferencia sea un pequeñísimo detalle, el ejercicio se complica y sobretodo requiere muchísimas más operaciones (solamente, por efectuarse con pilas) en ese caso, porque antes de depositar un elemento en la pila destino, debe quedar claro, que no consta ya... siendo una pila implica revisar todo su contenido (cada vez), extraer y volver a meter.

Sea la pila Q = 1,6,9,3,3,3,7,9  // cada n´mero representa un elemento...
y la pila Z = 2,0,7,9,7,4,1,1,5
la pila x =    (vacía)


buleano = Funcion Contiene(elemento e, pila X)
   pila aux
   elemento p
   buleano existe = FALSE

   Mientras x.Items   // ir sacando uno a uno los ítems de la pila para ver si los contiene.
       p = x.pop
        aux.push p

       Si x = e
            existe = TRUE
            Salir del bucle
       fin si        
   repetir

   mientras aux.Items  // volver a introducir los ítems sacados de la pila destino.
       p = aux.pop
       x.push p
   repetir

   Devolver existe
fin funcion


Aqui se opera estrayendo cada elemento de la pila Origen, y si no consta en destino, se añade.

Procedimiento UnionPX(pila O, pila X)
   elemento p

   Mientras O.Items
       p = O.Pop
       Si Contiene(p, X) = FALSE
           X.push p
       fin si
   repetir        
fin procedmiento


Finalmente se opera con cada pila solicitada ...

Procedimiento UnionZQ(pila Z, pila Q, pila X)
   // Si se considera que la pila X está vacía, puede comenzarse por colocar el primer elemento de la pila Z
   X.Push(Z.Pop)
   // Pero si tampoco se sabe si la pila Z, está o no vacía no sería acertado la anterior línea...

   UnionPX(Z, X)
   UnionPX(Q, X)
Fin procedmiento


Es laborioso, por cuanto la pila X, con cada ítem debe ser revisada entera y cuantos más se añaden más larga serán las siguientes revisiones...

la pila X, por tanto contendrá finalmente: x = 1,6,9,3,7,2,0,4,5