Skip to content

Commit 4e06974

Browse files
authored
Merge pull request mouredev#6305 from sarismejiasanchez/retos_programacion
#7 - Python
2 parents 5bcd2da + fc5622b commit 4e06974

File tree

1 file changed

+189
-0
lines changed

1 file changed

+189
-0
lines changed
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
# #07 PILAS Y COLAS
2+
3+
"""
4+
* EJERCICIO:
5+
* Implementa los mecanismos de introducción y recuperación de elementos propios de las
6+
* pilas (stacks - LIFO) y las colas (queue - FIFO) utilizando una estructura de array
7+
* o lista (dependiendo de las posibilidades de tu lenguaje).
8+
*
9+
"""
10+
# PILAS
11+
# https://docs.hektorprofe.net/python/colecciones-de-datos/pilas/
12+
print("PILAS - Stacks LIFO (Last In First Out)")
13+
"""
14+
Son colecciones de elementos ordenados que únicamente permiten dos acciones:
15+
16+
- Añadir un elemento a la pila.
17+
- Sacar un elemento de la pila.
18+
19+
La peculiaridad es que el último elemento en entrar es el primero en salir. En inglés se conocen como estructuras LIFO (Last In First Out).
20+
"""
21+
# Las podemos crear como listas normales
22+
stack = [3, 5, 7, 9]
23+
print(stack)
24+
25+
# Añadir elementos al final con el append():
26+
stack.append(11)
27+
stack.append(13)
28+
print(stack) # [3, 5, 7, 9, 11, 13]
29+
30+
# Para sacar los elementos utilizaremos el método pop().
31+
# Al utilizar este método devolveremos el último elemento, pero también lo borraremos:
32+
print(stack.pop()) # 13
33+
print(stack) # [3, 5, 7, 9, 11]
34+
35+
# Si queremos trabajar con él deberíamos asignarlo a una variable:
36+
last_value = stack.pop()
37+
print(last_value) # 11
38+
39+
# Si vamos sacando elementos llegará un momento en que la pila estará vacía
40+
# y dará error porque no podrá sacar nada más:
41+
stack.pop() # 9
42+
stack.pop() # 7
43+
stack.pop() # 5
44+
stack.pop() # 3
45+
# stack.pop() # IndexError: pop from empty list
46+
print(stack)
47+
48+
49+
# COLAS
50+
# https://docs.hektorprofe.net/python/colecciones-de-datos/colas/
51+
# https://docs.python.org/es/3.8/library/queue.html
52+
print("\nCOLAS - Queue FIFO (First In First Out)")
53+
54+
"""
55+
Son colecciones de elementos ordenados que únicamente permiten dos acciones:
56+
57+
- Añadir un elemento a la cola.
58+
- Sacar un elemento de la cola.
59+
60+
La peculiaridad es que el primer elemento en entrar es el primero en salir. En inglés se conocen como estructuras FIFO (First In First Out).
61+
62+
La mejor alternativa en Python para crear colas es usar el módulo queue
63+
https://docs.python.org/es/3.8/library/queue.html
64+
"""
65+
66+
import queue
67+
68+
# Crear una cola
69+
cola = queue.Queue()
70+
71+
# Agregar elementos
72+
def agregar_elemento(cola, elemento):
73+
cola.put(elemento)
74+
print(f"Elemento agregado a la cola: {elemento}")
75+
76+
# Recuperar elemmentos
77+
def recuperar_elemento(cola):
78+
try:
79+
elemento = cola.get(timeout=1) # Espera hasta 1 segundo para obtener un elemento
80+
print(f"Elemento recuperado de la cola: {elemento}")
81+
return elemento
82+
except queue.Empty:
83+
print("La cola está vacía, no hay elementos que recuperar.")
84+
85+
# Probar funciones
86+
# Agregar elementos a la cola
87+
agregar_elemento(cola, 1)
88+
agregar_elemento(cola, 2)
89+
agregar_elemento(cola, 3)
90+
91+
# Recuperar elementos de la cola
92+
recuperar_elemento(cola) # 1
93+
recuperar_elemento(cola) # 2
94+
recuperar_elemento(cola) # 3
95+
recuperar_elemento(cola) # La cola está vacía, no hay elementos que recuperar.
96+
97+
98+
"""
99+
* DIFICULTAD EXTRA (opcional):
100+
* - Utilizando la implementación de pila y cadenas de texto, simula el mecanismo adelante/atrás
101+
* de un navegador web. Crea un programa en el que puedas navegar a una página o indicarle
102+
* que te quieres desplazar adelante o atrás, mostrando en cada caso el nombre de la web.
103+
* Las palabras "adelante", "atrás" desencadenan esta acción, el resto se interpreta como
104+
* el nombre de una nueva web.
105+
"""
106+
print("\nDIFICULTAD EXTRA")
107+
108+
print("\nSimular el mecanismo adelante/atrás de un navegador web".upper())
109+
110+
# Inicializar la pila para el historial y un índice para la posición actual
111+
historial = [] # Lista que actúa como pila para el historial de páginas visitadas
112+
indice_actual = -1 # Indica la posición actual en el historial (inicialmente no hay páginas visitadas)
113+
114+
def navegar(pagina):
115+
# Ir a una nueva página.
116+
global indice_actual # Usamos la variable global
117+
118+
# Verifica si el indice_actual es menor que la longitud del historial menos uno.
119+
if indice_actual < len(historial) - 1:
120+
# Si estamos en medio del historial y vamos a una nueva página, descartamos adelante
121+
historial[indice_actual + 1:] = [] # Limpiar el historial hacia adelante
122+
historial.append(pagina) # Agregar nueva página al historial
123+
indice_actual += 1 # Actualizar la posición
124+
print(f"Navegando a: {pagina}")
125+
126+
def atras():
127+
# Navegar hacia atrás en el historial.
128+
global indice_actual # Usamos la variable global
129+
130+
# Comprueba si indice_actual es mayor que 0.
131+
# Si es así, significa que hay una página anterior a la que puede navegar.
132+
if indice_actual > 0:
133+
# Decrementa indice_actual en uno para moverse hacia atrás en el historial.
134+
indice_actual -= 1 # Mover hacia atrás
135+
# Muestra el nombre de la página a la que ha retrocedido.
136+
print(f"Navegando a: {historial[indice_actual]}")
137+
else:
138+
# Si no hay páginas anteriores, se muestra un mensaje indicando que no se puede retroceder.
139+
print("No hay más páginas en el historial para ir hacia atrás.")
140+
141+
def adelante():
142+
# Navegar hacia adelante en el historial.
143+
global indice_actual # Usamos la variable global
144+
145+
# Comprueba si indice_actual es menor que el último índice del historial.
146+
# Esto indica que hay una página hacia adelante.
147+
if indice_actual < len(historial) - 1:
148+
indice_actual += 1 # Mover hacia adelante
149+
# Muestra el nombre de la página a la que ha avanzado.
150+
print(f"Navegando a: {historial[indice_actual]}")
151+
else:
152+
# Si no hay páginas hacia adelante, se muestra un mensaje indicando que no se puede avanzar.
153+
print("No hay más páginas para avanzar.")
154+
155+
# Interacción con el usuario
156+
157+
# Se usa un bucle while True para permitir que el usuario
158+
# siga interactuando con el simulador.
159+
while True:
160+
# Se le pide al usuario que ingrese un comando.
161+
# strip() elimina los espacios en blanco al principio y al final, y
162+
# lower() convierte la entrada a minúsculas para que la comparación
163+
# sea insensible a mayúsculas.
164+
comando = input("Ingresa una página web, 'adelante', o 'atras' (o 'salir' para terminar): ").strip().lower()
165+
166+
# Si el usuario ingresa 'salir', se imprime un mensaje y se rompe el bucle,
167+
# terminando el programa.
168+
if comando == "salir":
169+
print("Saliendo del simulador del navegador")
170+
break
171+
# Si el comando es 'atras', se llama a la función atras().
172+
elif comando == "atras":
173+
atras()
174+
# Si el comando es 'adelante', se llama a la función adelante().
175+
elif comando == "adelante":
176+
adelante()
177+
# Para cualquier otra entrada, se considera que es una nueva página,
178+
# por lo que se llama a ir_a_pagina(comando).
179+
else:
180+
navegar(comando)
181+
182+
183+
"""
184+
* DIFICULTAD EXTRA (opcional):
185+
* - Utilizando la implementación de cola y cadenas de texto, simula el mecanismo de una
186+
* impresora compartida que recibe documentos y los imprime cuando así se le indica.
187+
* La palabra "imprimir" imprime un elemento de la cola, el resto de palabras se
188+
* interpretan como nombres de documentos.
189+
"""

0 commit comments

Comments
 (0)