Skip to content

Commit 6fc7df3

Browse files
committed
#7 - Python
1 parent fcc1b17 commit 6fc7df3

File tree

1 file changed

+358
-0
lines changed

1 file changed

+358
-0
lines changed
Lines changed: 358 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,358 @@
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("\nLIFO\n")
11+
12+
# LIST
13+
print("\nLISTA\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("\nPila rellenada\n")
24+
print(mi_list_stack)
25+
26+
# Usamos pop() para eliminar e último elemento introducido => LIFO
27+
print("\nBorrado 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('\nTras el borrado de elementos de la pila:')
33+
print(mi_list_stack)
34+
35+
# QUEUE MODULE
36+
print("\nQUEUE 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("\nPila 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('\nBorrado de elementos de la pila:\n')
58+
print(stack.get())
59+
print(stack.get())
60+
print(stack.get())
61+
62+
print("\nVaciar: ", stack.empty())
63+
64+
# NODE CLASS
65+
print("\nNODE 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("\nPila rellenada\n")
135+
print(stack)
136+
137+
# Eliminamos varios valores pasados desde un bucle for
138+
print("\nBorrado 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('\nTras el borrado de elementos de la pila\n:')
145+
print(stack)
146+
147+
'''
148+
FIFO
149+
'''
150+
print("\nFIFO\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("\nEJERCICIO 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("\nEJERCICIO 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("\nEJERCICIO 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

Comments
 (0)