1+ """
2+ Implementa los mecanismos de introducción y recuperación de elementos propios de las
3+ pilas (stacks - LIFO) y las colas (queue - FIFO) utilizando una estructura de array
4+ o lista (dependiendo de las posibilidades de tu lenguaje).
5+ """
6+
7+ '''
8+ LIFO
9+ '''
10+ print ("\n LIFO\n " )
11+
12+ # LIST
13+ print ("\n LISTA\n " )
14+
15+ mi_list_stack = []
16+
17+ # Añadimos elementos a la pila, usamos el métdo que tenemos en las listas => append()
18+ # como si fuera la function push
19+ mi_list_stack .append ("Hola" )
20+ mi_list_stack .append ("Python" )
21+ mi_list_stack .append ("!" )
22+
23+ print ("\n Pila rellenada\n " )
24+ print (mi_list_stack )
25+
26+ # Usamos pop() para eliminar e último elemento introducido => LIFO
27+ print ("\n Borrado de elementos de la pila:\n " )
28+ print (mi_list_stack .pop ())
29+ print (mi_list_stack .pop ())
30+ print (mi_list_stack .pop ())
31+
32+ print ('\n Tras el borrado de elementos de la pila:' )
33+ print (mi_list_stack )
34+
35+ # QUEUE MODULE
36+ print ("\n QUEUE MODULE\n " )
37+
38+ from queue import LifoQueue
39+
40+ # Inicializamos el stack con un tamaño máximo
41+ stack = LifoQueue (maxsize = 3 )
42+
43+ # Con la función qsize() vemos el número de elementos
44+ # que tiene la pila
45+ print (stack .qsize ())
46+
47+ # Hacemos uso de la función put() para hacer el push
48+ stack .put ("Hola" )
49+ stack .put ("Python" )
50+ stack .put ("!" )
51+
52+ print ("\n Pila rellenada\n " )
53+ print ("Lleno: " , stack .full ())
54+ print ("Tamaño: " , stack .qsize ())
55+
56+ # Hacemos uso de la función get() para hacer pop => LIFO
57+ print ('\n Borrado de elementos de la pila:\n ' )
58+ print (stack .get ())
59+ print (stack .get ())
60+ print (stack .get ())
61+
62+ print ("\n Vaciar: " , stack .empty ())
63+
64+ # NODE CLASS
65+ print ("\n NODE CLASS\n " )
66+
67+ # Class Node
68+ class Node :
69+ def __init__ (self , value ):
70+ self .value = value
71+ self .next = None
72+
73+ # Class Stack
74+ class Stack :
75+
76+ # Inicializamos una pila haciendo uso de un
77+ # modo ficticio, que es más sencillo de
78+ # manejar en casos extremos
79+ def __init__ (self ):
80+ self .head = Node ("head" )
81+ self .size = 0
82+
83+ # Representación de un String en la pila
84+ def __str__ (self ):
85+ cur = self .head .next
86+ out = ""
87+ while cur :
88+ out += str (cur .value ) + "->"
89+ cur = cur .next
90+ return out [:- 2 ]
91+
92+ # Obtener el tamaño actual de la pila
93+ def getSize (self ):
94+ return self .size
95+
96+ # Comprobar si la pila está vacía
97+ def isEmpty (self ):
98+ return self .size == 0
99+
100+ # Obtener el elemento superior de la pila por medio de peek
101+ def peek (self ):
102+ # Comprobación para ver si estamos viendo una pila vacía
103+ if self .isEmpty ():
104+ return None
105+ return self .head .next .value
106+
107+ # Introducir un valor en la pila por medio de push
108+ def push (self , value ):
109+ node = Node (value )
110+ node .next = self .head .next # Make the new node point to the current head
111+ self .head .next = node #!!! # Update the head to be the new node
112+ self .size += 1
113+
114+ # Elimina un valor de la pila por medio de pop y lo devuelve.
115+ def pop (self ):
116+ # Comprobamos que la pila no esté vacía
117+ if self .isEmpty ():
118+ raise Exception ("Eliminando desde una pila vacía" )
119+ remove = self .head .next
120+ self .head .next = remove .next #!!! changed
121+ self .size -= 1
122+ return remove .value
123+
124+ # Ejecución
125+
126+ # Creamos una instancia de la pila
127+ stack = Stack ()
128+
129+ # Introducimos varios valores creados desde un bucle for
130+ for i in range (1 , 11 ):
131+ stack .push (i )
132+
133+ # Imprimimos la pila tras el rellenado
134+ print ("\n Pila rellenada\n " )
135+ print (stack )
136+
137+ # Eliminamos varios valores pasados desde un bucle for
138+ print ("\n Borrado de elementos de la pila:\n " )
139+ for _ in range (1 , 6 ):
140+ top_value = stack .pop ()
141+ print (f"Eliminado: { top_value } " ) # variable name changed
142+
143+ # Imprimimos la pila tras el borrado
144+ print ('\n Tras el borrado de elementos de la pila\n :' )
145+ print (stack )
146+
147+ '''
148+ FIFO
149+ '''
150+ print ("\n FIFO\n " )
151+
152+ # Creamos una lista a modo de Queue
153+
154+ q = []
155+
156+ # Añadimos varios elementos, por ejemplo desde un for
157+ # a nuestra Queue
158+ for i in range (5 ):
159+ q .append (i )
160+
161+ # Mostramos el contenido de l Queue una vez rellenada
162+ print ("Elementos en la Queue: " , q )
163+
164+ # Al eliminar elementos, lo hacemos por el primer
165+ # elemento en la cola, es decir, índice 0
166+ removedele = q .pop (0 )
167+ print ("Elmento eliminado: " , removedele )
168+
169+ print (q )
170+
171+ # Mostrar el elemento en cabeza en la Queue
172+ head = q [0 ]
173+ print ("Primer elemento (Head) en la Queue:" , head )
174+
175+ # Tamaño de la Queue, es decir, el número
176+ # de elementos que la forman
177+ size = len (q )
178+ print ("Tamaño de la Queue: " , size )
179+
180+
181+ """
182+ * DIFICULTAD EXTRA (opcional):
183+ """
184+
185+ """
186+ - Utilizando la implementación de pila y cadenas de texto, simula el mecanismo adelante/atrás
187+ de un navegador web. Crea un programa en el que puedas navegar a una página o indicarle
188+ que te quieres desplazar adelante o atrás, mostrando en cada caso el nombre de la web.
189+ Las palabras "adelante", "atrás" desencadenan esta acción, el resto se interpreta como
190+ el nombre de una nueva web.
191+ """
192+
193+ # EJERCICIO 1
194+ # Usaremos LIFO
195+ print ("\n EJERCICIO 1 - CON ADELANTE (COMO LISTA)\n " )
196+
197+ # Nuestra pila
198+ mi_list = []
199+
200+ # Posición inicial
201+ posicion_pila = 0
202+
203+ # Pregunta inicial
204+ def preguntarAlUsuario (position = 0 ):
205+ return input ("Escribe una página a navegar o navega Adelante (adelante) o Atrás (atras): " )
206+
207+ # Respuesta Atrás
208+ def goAfter (position ):
209+ if position <= 0 :
210+ print ("Ha llegado al principio" )
211+ position = 0
212+ elif position > 0 :
213+ position -= 1
214+ # Sea lo que sea lo devolvemos
215+ return position
216+
217+ # Respuesta Adelante
218+ def goBefore (position ):
219+ if position == (len (mi_list ) - 1 ):
220+ print ("Ha llegado al final" )
221+ position = (len (mi_list ) - 1 )
222+ elif position < (len (mi_list ) - 1 ):
223+ position += 1
224+ # Sea lo que sea lo devolvemos
225+ return position
226+
227+ # Navegación
228+ def showWebSite (position ):
229+ print (f"Navegando por la web: { mi_list [position ]} " )
230+
231+ # Programa inicial
232+ def navegacion ():
233+ respuesta = preguntarAlUsuario ()
234+ while True :
235+ match respuesta :
236+ case "atras" :
237+ # Comprobamos
238+ if len (mi_list ) == 0 :
239+ print ("No hay más registros" )
240+ respuesta = preguntarAlUsuario ()
241+ else :
242+ posicion_pila = goAfter (posicion_pila )
243+ showWebSite (posicion_pila )
244+ respuesta = preguntarAlUsuario ()
245+
246+ case "adelante" :
247+ # Comprobamos
248+ if len (mi_list ) == 0 :
249+ print ("No hay más registros" )
250+ respuesta = preguntarAlUsuario ()
251+ else :
252+ posicion_pila = goBefore (posicion_pila )
253+ showWebSite (posicion_pila )
254+ respuesta = preguntarAlUsuario ()
255+ case "salir" :
256+ print ("\n ¡HASTA LUEGO!\n " )
257+ break
258+ case _:
259+ if len (respuesta ) >= 1 :
260+ mi_list .append (respuesta )
261+ posicion_pila = mi_list .index (respuesta )
262+ showWebSite (posicion_pila )
263+ else :
264+ print ("Escriba una palabra u opción." )
265+ # Pase lo que pase
266+ respuesta = preguntarAlUsuario ()
267+
268+ # Ejecución programa 1
269+ navegacion ()
270+
271+ print ("\n EJERCICIO 1 - SIN ADELANTE (COMO PILA)\n " )
272+
273+ # Nuestra pila
274+ mi_stack = []
275+
276+ # Navegación
277+ def showWebSiteUser (position ):
278+ print (f"Navegando por la web: { mi_stack [position ]} " )
279+
280+ # Programa Inicial
281+ def navegacionWeb ():
282+ respuesta = preguntarAlUsuario ()
283+ while True :
284+ match respuesta :
285+ case "atras" :
286+ if len (mi_stack ) >= 1 :
287+ # Eliminamos el último registro
288+ mi_stack .pop ()
289+ # Para no provocar un problema en caso de no quedar elementos en la pila
290+ if (len (mi_stack ) > 0 ):
291+ showWebSiteUser (len (mi_stack )- 1 )
292+ else :
293+ print ("Ha llegado al principio" )
294+ # Pase lo que pase
295+
296+ respuesta = preguntarAlUsuario ()
297+ case "adelante" :
298+ print ("No es posible" )
299+ respuesta = preguntarAlUsuario ()
300+ case "salir" :
301+ print ("\n ¡HASTA LUEGO!\n " )
302+ break
303+ case _:
304+ if len (respuesta ) >= 1 :
305+ mi_stack .append (respuesta )
306+ showWebSiteUser (len (mi_stack )- 1 )
307+ # Pase lo que pase
308+ respuesta = preguntarAlUsuario ()
309+
310+ # Ejecución programa 1
311+ navegacionWeb ()
312+
313+ """
314+ - Utilizando la implementación de cola y cadenas de texto, simula el mecanismo de una
315+ impresora compartida que recibe documentos y los imprime cuando así se le indica.
316+ La palabra "imprimir" imprime un elemento de la cola, el resto de palabras se
317+ interpretan como nombres de documentos.
318+ """
319+
320+ # EJERCICIO 2
321+ # Usaremos FIFO
322+ print ("\n EJERCICIO 2\n " )
323+
324+ # Nuestra pila
325+ pool = []
326+
327+ # Pregunta inicial
328+ def preguntarAlUsuarioPool ():
329+ return input ("Escribe si deseas imprimir (imprimir) o agrega a la cola de impresión: " )
330+
331+ # Programa inicial
332+ def poolPrinter ():
333+ respuestaUsuario = preguntarAlUsuarioPool ()
334+ while True :
335+ match respuestaUsuario :
336+ case "imprimir" :
337+ # Comprobamos
338+ if len (pool ) == 0 :
339+ print ("No hay documentos en la cola de impresión, agregue uno antes" )
340+ respuestaUsuario = preguntarAlUsuarioPool ()
341+ else :
342+ print (f"Imprimimos el documento { pool [0 ]} " )
343+ pool .pop (0 )
344+ respuestaUsuario = preguntarAlUsuarioPool ()
345+ case "salir" :
346+ print ("\n ¡HASTA LUEGO!\n " )
347+ break
348+ case _:
349+ if len (respuestaUsuario ) >= 1 :
350+ pool .append (respuestaUsuario )
351+ print (f"Agregamos el documento { respuestaUsuario } a la cola de impresión" )
352+ else :
353+ print ("Escriba el nombre de un documento o si desea imprimir" )
354+ # Pase lo que pase
355+ respuestaUsuario = preguntarAlUsuarioPool ()
356+
357+ # Ejecución programa 2
358+ poolPrinter ()
0 commit comments