Advertisement
Guest User

Untitled

a guest
Dec 4th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.31 KB | None | 0 0
  1. #PARCIALITO 3
  2. #----------------------------------------------------------------
  3.  
  4. #BASICOS PILAS
  5. class Pila:
  6.     """ Representa una pila con operaciones de apilar, desapilar y
  7.        verificar si está vacía. """
  8.  
  9.     def __init__(self):
  10.         """ Crea una pila vacía. """
  11.         # La pila vacía se representa con una lista vacía
  12.         self.items=[]
  13.  
  14.     def apilar(self, x):
  15.         """ Agrega el elemento x a la pila. """
  16.         # Apilar es agregar al final de la lista.
  17.         self.items.append(x)
  18.        
  19.     def desapilar(self):
  20.         """ Devuelve el elemento tope y lo elimina de la pila.
  21.        Si la pila está vacía levanta una excepción. """
  22.         try:
  23.             return self.items.pop()
  24.         except IndexError:
  25.             raise ValueError("La pila está vacía")
  26.        
  27.     def esta_vacia(self):
  28.         """ Devuelve True si la lista está vacía, False si no. """
  29.         return self.items == []
  30.    
  31.     def __str__(self):
  32.         return str(self.items)
  33.        
  34. def generar_pila():
  35.     pilar=Pila()
  36.     lista=["hola","hola","si",1,5,"jaja"]
  37.     for elemento in lista:
  38.         pilar.apilar(elemento)
  39.     return pilar
  40.    
  41. #----------------------------------------------------------------
  42. """1. Escribir una funci´on reemplazar que tome una Pila, un valor nuevo y un
  43. valor viejo y reemplace en la Pila todas las ocurrencias de valor viejo por valor
  44. nuevo. Considerar que la Pila tiene las primitivas apilar(dato), desapilar() y
  45. esta vacia()."""        
  46. def reemplazar(pilita,valor_nuevo,valor_viejo):
  47.     pila_aux=Pila() #crea una pila vacia
  48.     while not pilita.esta_vacia():
  49.         elemento=pilita.desapilar()
  50.         if elemento==valor_viejo:
  51.             pila_aux.apilar(valor_nuevo)
  52.         else:
  53.             pila_aux.apilar(elemento)
  54.     while not pila_aux.esta_vacia(): #vuelve a acomodar la pila inicial (pilita)
  55.         item=pila_aux.desapilar()
  56.         pilita.apilar(item)
  57.        
  58.     print(pilita)
  59.     return pilita
  60.  
  61. pilar=generar_pila()  
  62. reemplazar(pilar,"ANITAAA","hola")
  63.  
  64. #----------------------------------------------------------------
  65. """3. Escribir una funci´on que reciba una pila de n´umeros y elimine de la misma
  66. los elementos consecutivos que est´en repetidos. Se pueden usar estructuras auxiliares.
  67. La funci´on no devuelve nada, simplemente modifica los elementos de la pila
  68. que recibe por par´ametro.
  69. Por ejemplo: remover duplicados consecutivos(Pila([2, 8, 8, 8, 3, 3, 2, 3, 3, 3, 1, 7]))
  70. Genera: Pila([2, 8, 3, 2, 3, 1, 7])."""
  71.  
  72. def remover_duplicados_consecutivos(pila_numeros):
  73.     pila_aux=Pila()
  74.     while not pila_numeros.esta_vacia():
  75.         elemento=pila_numeros.desapilar()
  76.         if not pila_aux.esta_vacia() and pila_aux.ver_tope()!=elemento:
  77.             pila_aux.apilar(elemento)
  78.         elif pila_aux.esta_vacia():
  79.             pila_aux.apilar(elemento)  
  80.            
  81.     while not pila_aux.esta_vacia():
  82.         item=pila_aux.desapilar()
  83.         pila_numeros.apilar(item)
  84.        
  85.     print(pila_numeros)
  86. pilar=generar_pila()
  87. remover_duplicados_consecutivos(pilar) 
  88. #----------------------------------------------------------------
  89.  
  90. S_APERTURA=["(","[","{"]
  91. S_CIERRE=[")","]","}"]
  92.  
  93. def esta_balanceada(expresion):
  94.     pila=Pila()
  95.     for elemento in expresion:
  96.         if elemento in S_APERTURA:
  97.             pila.apilar(elemento)
  98.         elif elemento in S_CIERRE:
  99.             if pila.esta_vacia():
  100.                 return False
  101.             elem_tope=pila.desapilar()
  102.             pos=S_APERTURA.index(elem_tope)
  103.             if elemento!=S_CIERRE[pos]:
  104.                 return False
  105.     return True
  106.    
  107. #----------------------------------------------------------------
  108. #LISTA ENLAZADA
  109.  
  110. class _Nodo():
  111.     def __init__(self,dato=None,prox=None):
  112.         self.dato=dato
  113.         self.prox=prox
  114.     def __str__(self):
  115.         return str(self.dato)
  116.  
  117. class _IteradorListaEnlazada:
  118.     def __init__(self,prim):
  119.         self.actual=prim
  120.     def __next__(self):
  121.         if self.actual is None:
  122.             raise StopIteration()
  123.         dato=self.actual.dato
  124.         self.actual=self.actual.prox
  125.         return dato
  126.  
  127.              
  128. class ListaEnlazada(object):
  129.     def __init__(self):
  130.         self.prim=None
  131.         self.len=0
  132.        
  133.     def insert(self, i, x):
  134.         """ Inserta el elemento x en la posición i.
  135.        Si la posición es inválida, levanta IndexError """
  136.         if (i > self.len) or (i < 0):
  137.             raise IndexError("Posición inválida")
  138.         nuevo = _Nodo(x)
  139.         if i == 0:
  140.             nuevo.prox = self.prim
  141.             self.prim = nuevo
  142.         else:
  143.             n_ant = self.prim
  144.             for pos in range(1,i):
  145.                 n_ant = n_ant.prox
  146.             nuevo.prox = n_ant.prox
  147.             n_ant.prox = nuevo
  148.         self.len += 1
  149.        
  150.     def __len__(self):
  151.         return self.len
  152.        
  153.     def append(self,x):
  154.         self.insert(len(self),x) #len(self) es la última posición
  155.        
  156.     def __str__(self):
  157.         cadena=""
  158.         n_act=self.prim
  159.         while n_act is not None:
  160.             cadena+=str(n_act.dato)+","
  161.             n_act=n_act.prox
  162.         return "[{}]".format(cadena.rstrip(","))
  163.        
  164.     def __iter__(self):
  165.         return _IteradorListaEnlazada(self.prim)
  166.  
  167.     def invertir(self):
  168.         anterior=None
  169.         actual=self.prim
  170.         siguiente=actual.prox
  171.         while actual:
  172.             actual.prox=anterior
  173.             anterior=actual
  174.             actual=siguiente
  175.             if siguiente:
  176.                 siguiente=siguiente.prox
  177.             self.prim=anterior 
  178.    
  179. #crear la lista
  180. lista=ListaEnlazada()
  181. lista.append(15)
  182. lista.append(17)
  183. #----------------------------------------------------------------
  184. #COLAS
  185. #OJO; SE UTILIZA LISTA ENLAZADA, USE LA LISTA DE PYTHON PARA VERIFICAR LOS EJERCICIOS MAS FACILMENTE.
  186.  
  187. class Cola:
  188.     def __init__(self):
  189.         """ Crea una cola vacía. """
  190.         # La cola vacía se representa por una lista vacía
  191.         self.items=[]
  192.  
  193.     def encolar(self, x):
  194.         self.items.append(x)
  195.     def desencolar(self):
  196.         try:
  197.             return self.items.pop(0)
  198.         except:
  199.             raise ValueError("La cola está vacía")
  200.     def esta_vacia(self):
  201.         return self.items == []
  202.     def ver_tope(self):
  203.         return self.items[-1]
  204.  
  205. def generar_cola():
  206.     lista=[1,2,5,5,28]
  207.     cola_prueba=Cola()
  208.     for elemento in lista:
  209.         cola_prueba.encolar(elemento)
  210.     return cola_prueba
  211. #----------------------------------------------------------------  
  212. """6. Escribir una función “reducir” que reciba por parámetro una cola y una función
  213. f de dos parámetros, y aplique sucesivamente la función f a los dos primeros
  214. elementos de la cola (luego de desencolarlos) y encole el resultado, hasta que sólo
  215. quede un elemento. La función “reducir” debe devolver el ´unico elemento restante
  216. en la cola."""
  217.  
  218. def sumar(n1,n2):
  219.     return n1+n2
  220.  
  221. def reducir(cola,f):
  222.     cola_nueva=Cola()
  223.     while not cola.esta_vacia():
  224.         try:
  225.             elemento1=cola.desencolar()
  226.             elemento2=cola.desencolar()
  227.             sumatoria=f(elemento1,elemento2)
  228.             cola_nueva.encolar(sumatoria)
  229.         except ValueError: #la cola esta vacia
  230.             return elemento1
  231.                
  232.                
  233. cola_prueba=generar_cola()
  234. reducir(cola_prueba,sumar)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement