Página 1 de 1

Agregar y eliminar elementos en una pila

NotaPublicado: 2021-08-24 20:48 @908
por alexismoran72
Hola. Soy nuevo en Perl y me gustaría saber cómo inserto elementos a una pila uno encima de otros (apilar).
En el lenguaje c++ existe algo llamado nodos y es para ir agregando elementos y no sé cómo hacer eso en Perl. :(

Re: Agregar y eliminar elementos en una pila

NotaPublicado: 2021-08-25 04:37 @234
por explorer
Bienvenido/a a los foros de Perl en Español, alexismoran72.

En Perl cuentas con los arrays para guardar información de forma reglada (indexada). Imagínate que los array son vectores o matrices: cada elemento sigue al anterior. El primer elemento tiene índice 0 y el límite superior está determinado por la cantidad de memoria disponible.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Declaración
  2. my @array;   # Declaramos que '@array' es un array, es decir, es un contenedor de una "lista de elementos"
  3.  
  4. # Una "lista de elementos" es entre 0 elementos y el resto de la memoria del computador
  5. (1, 2, 5, 42, "La casa de la abuela", 0xABADBEBECAFE);
  6.  
  7. # Definición
  8. # Definimos el contenido de un array asignando (=) una lista de elementos al array
  9. @array = (1, 2, 5, 42, "La casa de la abuela", 0xABADBEBECAFE);
  10.  
  11. # Salida de todo el array
  12. say @array;    # Salida directa: 12542La casa de la abuela188762717866750   (salen todos seguidos)
  13. say "@array";  # Salida interpolada: 1 2 5 42 La casa de la abuela 188762717866750   (salen separados con el separador por defecto)
  14.  
  15. # Número de elementos
  16. # Tratar el array en contexto escalar:
  17. my $numero = @array;  # $numero contendrá en este caso, 6
  18.  
  19. # Acceso al contenido
  20. # El sigilo '@' indica "pluralidad", mientras que el sigilo '$' indica 'singularidad'.
  21. # Cuando accedemos a varios elementos del array, necesitamos poner '@' delante.
  22. # Si sólo accedemos a un elemento, necesitamos poner '$' delante.
  23.  
  24. # Acceso a un elemento
  25. say $array[3];         # Salida del cuarto elemento (recordar que empiezan en 0)
  26. $array[1] = 'Camión';  # Modificación del segundo elemento
  27. $array[-1] = 'FIN';    # Modificación del "último" elemento
  28.  
  29. # Acceso a varios elementos
  30. my($x, $y, $z) = @array[0,2,3];   # los elementos 0, 2 y 3 se asignan a las variables escalares
  31. my @extracto = @array[3..5];      # los elementos 3, 4 y 5 se asignan a la variable array
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Acceso en forma de cola o pila:
En Perl contamos con 8 funciones para modificar o acceder al contenido de un array, simulando una cola o una pila. Esas funciones son:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
each   : Permite recorrer un array; nos devuelve el índice y el valor de cada posición.
keys   : Devuelve una lista con los índices de las posiciones (realmente, 0, 1, 2, 3...)
values : Devuelve una lista con los valores de las posiciones (realmente, igual que pedir @array)
push   : Agrega un elemento AL FINAL de la lista de elementos
pop    : Extrae un elemento DEL FINAL de la lista de elementos
shift  : Extrae un elemento DEL PRINCIPIO de la lista de elementos
unshift: Agrega un elemento AL PRINCIPIO de la lista de elementos
splice : Permite extraer, modificar o agregar elementos en cualquier posición de la lista de elementos
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Estas últimas (pop, push, shift y unshift) son las que utilizarás para simular una pila.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @pila;    # empezamos con una pila vacía
  2.  
  3. # Para apilar, usar push
  4. push @pila, 42;     # la función push() devuelve el número de elementos del array, pero en este ejemplo no lo usaremos
  5. push @pila, 37;
  6. push @pila, '+';
  7.  
  8. # Para desapilar, usar pop
  9. my $elemento = pop @pila;
  10.  
  11. # Para usar un array como una cola, usar push() para apilar y shift() para desapilar.
  12. push @pila, 37;
  13. my $siguiente = shift @pila;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Tienes una introducción a los array en perldoc perlintro. Toda la información sobre los arrays en perldata. Introducción a las estructuras de datos en perldsc. Estructuras más complejas en perllol. Detalle completo de las referencias en perlref y perlreftut.

Re: Agregar y eliminar elementos en una pila

NotaPublicado: 2021-08-31 13:16 @594
por alexismoran72
Hola muy buenas tardes, tengo una duda: me gustaría saber cómo hacer para que el usuario cree una @pila.

Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Bienvenido!
  2. 1.- Crear la pila.
  3. 2.- Ingresar elemento (PUSH)
  4. 3.- Sacar elemento (POP)
  5. 4.- Ver cima (PEEK)
  6. 5.- Imprimir toda la pila.
  7. 6.- Salir.\n";
  8.  
  9. print "\nElija una opción: ";
  10. chop ($opcion = <STDIN>);
  11. if ($opcion == 1) {
  12.  
  13. } elsif ($opcion == 2) {
  14.         if (@pila = null) # no sé si se escribe así en Perl pero es una referencia
  15.                           # si la pila no fue creada quiero que me imprima "Pila no creada, primero cree la pila"
  16.                          
  17.             print "Pila no creada, primero cree la pila";
  18.         } elsif (@pila = creada) { #si la pila está creada
  19.             print "Ingresa un elemento a la pila:";
  20.             $elemento = <>;
  21.             push @pila , $elemento;
  22.             chomp ($elemento);
  23.             print "Ingresado! [$elemento] \n";
  24.         }
  25. }
  26. #Las demás opciones sé cómo hacerlo.
  27.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Agregar y eliminar elementos en una pila

NotaPublicado: 2021-08-31 17:01 @751
por explorer
Puedes simplemente comprobar el número de elementos que contiene @pila.

if (@pila == 0) { # La pila está vacía o no se ha usado nunca

}


Si quieres poner la @pila a 0 (vaciarla), puedes usar el comando undef:

undef @pila;

Re: Agregar y eliminar elementos en una pila

NotaPublicado: 2021-08-31 19:29 @854
por alexismoran72
Perdón, pero no me funciona. Algo estoy haciendo mal. Es lo único que me falta para terminar mi proyecto :(
Solo quiero hacer que mi opción de "Crear pila" funcione.

Al querer ingresar un valor a la pila (Opción 2) me tiene que decir que primero tengo que crear una pila. Al presionar Opción 1 tiene que crearse la @pila y luego ahí al querer ingresar un valor a la pila me tiene que dejar ingresar datos a mi @pila sin problemas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "¡Bienvenido!
  2. 1.- Crear pila.
  3. 2.- Ingresar elemento (PUSH)
  4. 3.- Salir\n";
  5. do {
  6.     print "Elija una opción: ";
  7.     chop ($opcion = <STDIN>);
  8.     if ($opcion == 1) {
  9.         if (@pila == 0) {
  10.             print "Pila creada! ";
  11.         } elsif (@pila == 1) {
  12.             my @pila;
  13.         }
  14.     } elsif ($opcion == 2) {
  15.         if (@pila == 0) {
  16.             print "¡Aún no has creado una pila! ";
  17.         } else {
  18.             print "ingresa un valor: ";
  19.             $dato = <>;
  20.             push @pila, $dato;
  21.             chomp ($dato);
  22.             print "Ingresado! [$dato] \n";
  23.         }
  24.     } elsif ($opcion == 3) {
  25.         print "Desea salir?
  26. 1.- Si    2.- NO\n";
  27.         chomp ($salir = <STDIN>);
  28.     }
  29. } while $salir ne '1';
  30.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ya es lo único que me falta :cry:

Re: Agregar y eliminar elementos en una pila

NotaPublicado: 2021-09-01 13:46 @615
por explorer
A ver... "crear una pila" no es tan sencillo como poner "my @pila".

En la línea 13 tienes puesto eso. Pero está encerrado entre las llaves del elsif(). Eso quiere decir que en la línea 14, en la llave de cierre, la @pila creada en la línea 13, desaparece. Las llaves, en Perl, crean contextos. Si dentro de esos contextos creas variables locales (con my()), entonces desaparecen cuando se termina el contexto.

Yo lo haría de la forma más simple posible:
1- Pongo my @pila; al principio del programa. Eso ya me sirve para poder usarla en el resto del código. Es decir: "la pila ya está creada por defecto nada más arrancar el programa".

2- Si el usuario pide crear una pila, lo que hago es poner la @pila a 0 elementos: undef @pila;

3- Si el usuario pide ingresar un elemento, uso el push @pila, $dato;

Pero... si el objetivo es obligar a que el usuario primero debe realizar el paso de crear la @pila antes de poder ingresar un $dato, necesito algo que me indique en qué momento me encuentro. Eso lo puedes controlar con una bandera.

Por ejemplo, con la bandera

my $esta_creada = 0;

al principio del programa, indico que, AUNQUE EXISTA @pila dentro del programa, la "pila" (como concepto para el usuario) aún no se ha creado.

Luego, en la opción 1, pongo la pila a cero (undef @pila;) y la marco como creada ($esta_creada = 1;).

En la opción 2, hago
1- ¿está creada la pila? (if ($esta_creada) {)
2- si lo está, hago el push
3- si no lo está, mando el mensaje de error al usuario