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 ("\n COLAS - 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 ("\n DIFICULTAD EXTRA" )
107+
108+ print ("\n Simular 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