• Publicidad

Agregar y eliminar elementos en una pila

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Agregar y eliminar elementos en una pila

Notapor alexismoran72 » 2021-08-24 20:48 @908

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. :(
alexismoran72
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2021-08-24 20:31 @896

Publicidad

Re: Agregar y eliminar elementos en una pila

Notapor explorer » 2021-08-25 04:37 @234

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.004 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.002 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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Agregar y eliminar elementos en una pila

Notapor alexismoran72 » 2021-08-31 13:16 @594

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.002 segundos, usando GeSHi 1.0.8.4
alexismoran72
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2021-08-24 20:31 @896

Re: Agregar y eliminar elementos en una pila

Notapor explorer » 2021-08-31 17:01 @751

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;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Agregar y eliminar elementos en una pila

Notapor alexismoran72 » 2021-08-31 19:29 @854

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.002 segundos, usando GeSHi 1.0.8.4


Ya es lo único que me falta :cry:
alexismoran72
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2021-08-24 20:31 @896

Re: Agregar y eliminar elementos en una pila

Notapor explorer » 2021-09-01 13:46 @615

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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 2 invitados