def crear_pila_con_datos(): obj = Pila(1) for i in range(5): obj.push(i) return obj
def __init__(self,archivo): '''Toma como parametro un archivo y crea la instancia inicial de la clase Editor con sus respectivos atributos'''' self.archivo=archivo self.t_act=self.archivo.tiempos.prim self.pos_t=0 self.pila=Pila()
class _IteradorListaEnlazada(): """Itera una instancia de la clase ListaEnlazada""" def __init__(self, prim): self.actual = prim self.pila_auxiliar = Pila() self.posicion = 0 def next(self): """Avanza una posicion y devuelve el dato. Si no hay posicion siguiente lanza una excepcion StopIteration. Si no hay elemento lanza una excepcion AttributeError.""" if not self.actual.prox: raise StopIteration('No hay más elementos en la lista') nodo = self.actual self.pila_auxiliar.apilar(nodo) self.actual = self.actual.prox self.posicion += 1 return self.actual.dato def prev(self): """Retrocede una posicion y devuelve el dato. Si no hay posicion anterior lanza una excepcion StopIteration. Si no hay elemento lanza una excepcion AttributeError.""" if self.pila_auxiliar.esta_vacia(): raise StopIteration('No hay elemento previo') nodo = self.pila_auxiliar.desapilar() self.actual = nodo self.posicion -= 1 return self.actual.dato
def test_case2(self): """ Testea que el metodo cantidad de la pila devuelva una cantidad correcta si se agrega un elemento solo en la inicializacion de la pila """ p = Pila(["elemento"]) # no se qué es más correcto: si usar assertEqual o usar assertTrue. # asumo que el True es que apunten al mismo elemento, mientras que el Equal compara valores. # en este caso, como son enteros, apuntarían al mismo "1" self.assertTrue(p.cantidad() == 1)
def test_case3(self): """ Testea que el método __str__ devuelva un string con la pila en orden desde el tope hacia el fondo correctamente""" p = Pila("caracteres") cadena = p.__str__() comparar = "Los elementos de la pila (de tope a fondo) son:\n s e r e t c a r a c" self.assertEqual(cadena, comparar) comparar2 = "Los elementos de la pila (de tope a fondo) son:\n s e r e t c a r a" self.assertNotEquals(cadena, comparar2)
def ejemplo1(): pila = Pila() pila.push(2) pila.push(3) pila.push(4) pila.push(5) pila.muestra() print () print (pila.top()) print (pila.top()) print (pila.pop()) print (pila.pop())
def calculadora_polaca(elementos): """ Dada una lista de elementos que representan las componentes de una expresión en notacion polaca inversa, evalúa dicha expresión. Si la expresion está mal formada, levanta ValueError. """ p = Pila() for elemento in elementos: print "DEBUG:", elemento # Intenta convertirlo a número try: numero = float(elemento) p.apilar(numero) print "DEBUG: apila ", numero # Si no se puede convertir a número, debería ser un operando except ValueError: # Si no es un operando válido, levanta ValueError if elemento not in "+-*/ %" or len(elemento) != 1: raise ValueError("Operando inválido") # Si es un operando válido, intenta desapilar y operar try: a1 = p.desapilar() print "DEBUG: desapila ", a1 a2 = p.desapilar() print "DEBUG: desapila ", a2 # Si hubo problemas al desapilar except ValueError: print "DEBUG: error pila faltan operandos" raise ValueError("Faltan operandos") if elemento == "+": resultado = a2 + a1 elif elemento == "-": resultado = a2 - a1 elif elemento == "*": resultado = a2 * a1 elif elemento == "/": resultado = a2 / a1 elif elemento == " %": resultado = a2 % a1 print "DEBUG: apila ", resultado p.apilar(resultado) # Al final, el resultado debe ser lo único en la Pila res = p.desapilar() if p.esPilaVacia(): return res else: print "DEBUG: error pila sobran operandos" raise ValueError("Sobran operandos")
def test_case1(self): """ Testea que el metodo cantidad de la pila devuelva la cantidad correcta de elementos aunque sean de distinto tipo, creando una pila vacia al comienzo """ p = Pila() p.apilar("uno") p.apilar(2) self.assertEqual(p.cantidad(), 2)
def evaluar(resultado): pilaOperadores = Pila() listaSufija = [] resultado = list(resultado.upper()) print(resultado) for simbolo in resultado: if simbolo in "0123456789": pilaOperadores.apilar(simbolo) else: if simbolo in "+-*/": simboloTope2 = pilaOperadores.desapilar() simboloTope = pilaOperadores.desapilar() res = calcularO(simboloTope, simbolo, simboloTope2) pilaOperadores.apilar(res) while not pilaOperadores.estaVacia(): listaSufija.append(pilaOperadores.desapilar()) return " ".join(listaSufija)
class _IteradorListaEnlazada: """Clase que itera sobre la lista enlazada. Contiene los metodos next, prev, insertar_marca_despues e insertar_marca_antes.""" def __init__(self, prim): self.actual = prim self.pila = Pila() def __next__(self): if self.actual is None: raise StopIteration() dato = self.actual.dato self.actual = self.actual.prox return dato def next(self): """El metodo devuleve el dato sobre el cual se encuenta y actualiza su posicion al siguiente nodo.""" if self.actual is None: raise StopIteration() dato = self.actual.dato self.pila.apilar(self.actual) self.actual = self.actual.prox return dato def prev(self): if self.pila.esta_vacia(): raise ValueError self.actual = self.pila.desapilar() return self.pila.ver_tope().dato def insertar_elem_despues(self, elem): """Dado un elemento 'elem' pasado por parametro, el metodo crea un nodo conteniendolo y lo inserta en la posicion actual del iterador.""" nodo = _Nodo(elem) nodo.prox = self.actual self.actual = nodo self.pila.ver_tope().prox = self.actual def insertar_elem_antes(self, elem): """Dado un elemento 'elem' pasado por parametro, el metodo crea un nodo conteniendolo y lo inserta justo antes de la posicion actual del iterador""" dato = self.pila.desapilar() nodo = _Nodo(elem) nodo.prox = dato self.pila.apilar(nodo) self.pila.apilar(dato)
def conseguir_ruta_iterativa(self, estado): #Condiciones iniciales estado_actual = estado pila = Pila() visitados = [] #Busqueda por profundidad (DFS) while (self.es_solucion(estado_actual)): visitados.append(estado_actual.conseguir_tablero()) hijos = self.crear_hijos(estado_actual) if len(hijos) != 0: for x in hijos: if x.conseguir_tablero() not in visitados: x.establecer_ruta_nodo( estado_actual.conseguir_ruta_nodo(), estado_actual.conseguir_tablero()) pila.push(x) estado_actual = pila.pop() estado_actual.establecer_ruta_nodo(estado_actual.conseguir_ruta_nodo(), estado_actual.conseguir_tablero()) return estado_actual
def test_case4(self): """ Testea que se agreguen correctamente los elementos a una pila """ p = Pila([1, "dos", {"tres": 3}, [4, "cuatro"], (5, "cinco")]) # el assertEqual espera un elemento de ti self.assertEqual(p.valores, [1, "dos", { "tres": 3 }, [4, "cuatro"], (5, "cinco")]) # no sé cuál de las dos opciones es más pythonic self.assertListEqual( p.valores, [1, "dos", { "tres": 3 }, [4, "cuatro"], (5, "cinco")])
def _backtrack(grilla, visitados, acciones_posibles, movimientos): visitados[h(grilla)] = True if soko.juego_ganado(grilla): return True, movimientos for accion in acciones_posibles: nuevo_estado = soko.mover(grilla, accion) if h(nuevo_estado) in visitados: continue solucion_encontrada, movimientos = _backtrack(nuevo_estado, visitados, acciones_posibles, movimientos) if solucion_encontrada: movimientos.apilar(accion) return True, movimientos return False, Pila()
def ingresarArbol(): while True: opcion = \ raw_input('Desea ingresar una expresion matematica en posfijo: (Y/N)' ) if opcion == 'Y': cadena = leerCadena() print 'cadena' , cadena pila = Pila() nodo = crearArbol(cadena, pila) print 'Resultado operacion: ', evaluar(nodo) if opcion == 'N': break imprimirDatos() return None
def construirArbol(expresionPostFija): pila = Pila() contador = 1 for elemento in expresionPostFija: if elemento in simbolos: numeroDeOperandos = 1 if elemento in operadoresunarios else 2 aux = numeroDeOperandos listaDeOperandos = [] while aux != 0: operando = pila.extraer() listaDeOperandos.append(operando) aux -= 1 resultado = construirSubArbol(listaDeOperandos, elemento) pila.incluir(resultado) else: if elemento == 'e': nuevoElemento = [[elemento, True, [], []], [], []] else: nuevoElemento = [[elemento, False, [contador], [contador]], [], []] pila.incluir(nuevoElemento) contador += 1 return pila.extraer()
def evaluarExpresion(expresionPostFijaList): pila = Pila() listaFinal = [] contador = 1 for caracter in expresionPostFijaList: if caracter in simbolos: listaDeOperandos = obtenerListaDeOperandos(pila, caracter) inicialA, finalA, inicialB, finalB = _obtenerEstadoInicialYFinal( listaDeOperandos) if len(listaDeOperandos) > 1: if caracter == "|": resultado = unirListas( listaDeOperandos, obtenerInstruccionesDeOperadoresNoUnitarios( caracter, contador, [inicialA, inicialB], [finalA, finalB], listaDeOperandos)) contador += 2 else: resultado = obtenerInstruccionesDeOperadoresNoUnitarios( caracter, contador, [inicialA, inicialB], [finalA, finalB], listaDeOperandos) #contador-=1 else: resultado = obtenerInstruccionesDeOperadoresUnitarios( listaDeOperandos, contador, [inicialA], [finalA], caracter) contador += 2 pila.incluir(resultado) else: tuplaTemporal = [(str(contador), str((contador + 1)), caracter)] contador += 2 pila.incluir(tuplaTemporal) listaFinal = pila.extraer() return [listaFinal]
class postfija: arbolbase = Pila() entrada = input() lista = entrada.split(" ") #print(lista) for element in lista: if (element == '+' or element == '-' or element == '*' or element == '/'): puntder = float(arbolbase.desapilar()) puntizq = float(arbolbase.desapilar()) if element == '+': arbolbase.apilar(puntizq + puntder) if element == '-': arbolbase.apilar(puntizq - puntder) if element == '*': arbolbase.apilar(puntizq * puntder) if element == '/': arbolbase.apilar(puntizq / puntder) else: #print (element) arbolbase.apilar(element) print(arbolbase.desapilar())
return str(n) + "\n\nCuenta regresiva terminada" else: return str(n) + "\n" + cuenta_regresiva(n - 1) def main2(): print(cuenta_regresiva(10)) main2() print("------------------------------------------------") print("Ejercicio 3: Sacar valor medio de una pila\n") pops = [] p = Pila() def mitad_pila(n, mitad): if n == mitad + 1: return "'" + str(p.pop()) + "' Es el valor medio de la pila" else: pops.append(p.pop()) return mitad_pila(n - 1, mitad) def main3(): print("Pila inicial") for num in range(1, 12): p.push(num) p.to_string()
def ejercicio1(): tablaLR = {(0,Lexico._tiposInt['IDENTIFICADOR']): 2, (0,3): 1, (1,Lexico._tiposInt['$']): -1, (2,Lexico._tiposInt['OPSUMA']): 3, (3,Lexico._tiposInt['IDENTIFICADOR']): 4, (4,Lexico._tiposInt['$']): -2} #Preparar la pila pila = Pila() fila = 0 columna = 0 accion = 0 aceptacion = 0 #Establecer la cadena de entrada lexico = Lexico("a+b") #Adecuar la pila pila.push(Lexico._tiposInt['$']) pila.push(0); #solicitar el simbolo al Lexico "a" lexico.sigSimbolo() #verificar si el simbolo en pila.top() tiene un desplazamiento o transicion con #respecto a lexico.tipo conforme a la tablaLR fila = pila.top() columna = lexico.tipo accion = tablaLR.get((fila,columna), 0) #sabemos que la accion va a ser d2, o sea accion = 2, numero positivo, #indica transicion o desplazamiento, entonces apilamos estos valores. pila.push(lexico.tipo) pila.push(accion) #Mostrar el progreso del algoritmo print() pila.muestra() print() #pedimos el siguiente simbolo "+" lexico.sigSimbolo() #verificar accion fila = pila.top() columna = lexico.tipo accion = tablaLR.get((fila,columna), 0) #sabemos que nos dara el desplazamiento 3; accion = 3, entonces apilamos pila.push(lexico.tipo) pila.push(accion) print() pila.muestra() print() #pedimos el siguiente simbolo "b" lexico.sigSimbolo() #verificar accion fila = pila.top() columna = lexico.tipo accion = tablaLR.get((fila,columna), 0) #sabemos que nos dara el desplazamiento 4; accion = 4, entonces apilamos pila.push(lexico.tipo) pila.push(accion) print() pila.muestra() print() #pedimos el siguiente simbolo "$" (llegamos al final de la entrada) lexico.sigSimbolo() #verificar accion fila = pila.top() columna = lexico.tipo accion = tablaLR.get((fila,columna), 0) #sabemos que nos dara la transicion -2; accion = -2, entonces -desapilamos- #Desapilaremos el doble del tamaño de la regla, la regla es E-> <id>+<id> #la longitud seria 3, nosotros desapilaremos 6 elementos. pila.pop() pila.pop() pila.pop() pila.pop() pila.pop() pila.pop() print() pila.muestra() print() #continuamos sin pedir el siguiente simbolo, debido a que la ultima accion fue #una reduccion, verificamos que accion sigue fila = pila.top() #seria 0 columna = 3 #nos quedamos en la columna 3, donde esta la regla en la matriz accion = tablaLR.get((fila,columna), 0) print() pila.muestra() print() #la accion resulta ser una transicion, entonces apilamos pila.push(3)#la representacion de la regla E en la matriz pila.push(accion) print() pila.muestra() print() #Como lo anterior fue una transicion, continuamos sin solicitar nuevo simbolo fila = pila.top() print("fila:",fila) columna = lexico.tipo print("columna:",columna) accion = tablaLR.get((fila,columna),0) print("accion: ",accion) print() pila.muestra() print() #la accion resulta ser -1, es decir, aceptacion.abs aceptacion = accion == -1 if aceptacion: print("Aceptado")
class Editor: def __init__(self,archivo): self.archivo=archivo self.t_act=self.archivo.tiempos.prim self.pos_t=0 self.pila=Pila() def representar_cancion(self): print('↓ Nro de track',end='\t\t\t\t\t') print('Tiempos (en segundos)') print(end=' ') for t in self.archivo.tiempos: posicion=self.archivo.tiempos.index(t) if self.pos_t==posicion: print('>'+str(t.obtener_tiempo())+'<', end=' ') else: print(t.obtener_tiempo(), end=' ') print() for x in range(len(t.obtener_nota())): print(x, end=' ') for t in self.archivo.tiempos: lista_notas=t.obtener_nota() nota=lista_notas[x] if nota: #La idea es que el usuario vea que notas estan activas print('[X]', end=' ') else: print('[ ]', end=' ') print() #--------------------------------------------------------------------# def guardar(self,archivo): with open(archivo,'w') as plp: """Quedo medio raro, mas que nada la parte de los tiempos pero me parece que funciona""" plp.write('FIELD,DATA\n') plp.write('C,{}\n'.format(self.archivo.canales)) for s in self.archivo.sonidos: tipo=s[0] frecuencia=[1] volumen=[2] plp.write('S,{}|{}|{}\n'.format(tipo,frecuencia,volumen)) tiempo=0 for t in self.archivo.tiempos: tiempo_nuevo=t.obtener_tiempo() if tiempo!=tiempo_nuevo: plp.write('T,{}\n'.format(tiempo_nuevo)) cadena='' for elem in t.obtener_nota(): if elem: cadena+='#' else: cadena+='·' plp.write('N,{}\n'.format(cadena)) tiempo=tiempo_nuevo print('El archivo se ha guardado con el nombre ',archivo) #--------------------------------------------------------------------# def avanzar(self,x=1): for iteracion in range(int(x)): if self.t_act.prox is None: raise IndexError('Fuera de rango') dato=self.t_act self.t_act=self.t_act.prox self.pila.apilar(dato) self.pos_t+=1 print(self.t_act) #--------------------------------------------------------------------# def retroceder(self,x=1): for iteracion in range(int(x)): if self.t_act is None: raise IndexError('Fuera de rango') dato=self.t_act self.t_act=self.pila.desapilar() self.t_act.prox=dato self.pos_t-=1 #--------------------------------------------------------------------# def reproducir(self): self.archivo.reproducir() def reproducir_tiempos(self,cant_tiempos,segundos=False): if not cant_tiempos: cant_tiempos=20 return lista_tiempos=[] tiempo=self.t_act for x in range(cant_tiempos): if tiempo is None: break lista_tiempos.append(tiempo.dato) tiempo=tiempo.prox self.archivo.reproducir_tiempos(lista_tiempos,segundos) #--------------------------------------------------------------------# def agregar_nota(self,tipo,frequency,volume): sonido_nuevo=self.archivo.convertir_objeto([tipo,frequency,volume]) print(sonido_nuevo) print(self.archivo.objeto_sonidos) for t in self.archivo.tiempos: if t is self.t_act.dato: t.agregar_nota(True) print(sonido_nuevo) t.agregar_nota_obj(sonido_nuevo) continue t.agregar_nota(False) self.archivo.objeto_sonidos.append(sonido_nuevo) #--------------------------------------------------------------------# def quitar_nota(self,pos): contador=0 print(self.archivo.objeto_sonidos) nota=self.archivo.objeto_sonidos.pop(pos) for t in self.archivo.tiempos: t.notas.pop(pos) if nota in t.obtener_nota_obj(): t.notas_obj.remove(nota) def activar_nota(self,pos): dato=self.t_act.dato.index_notas(pos) if dato: raise ValueError('El track elegido ya esta activado') self.t_act.dato.quitar_nota(pos) self.t_act.dato.agregar_nota(True,pos) nota=self.archivo.objeto_sonidos.devolver_posicion(pos) self.t_act.dato.agregar_nota_obj(nota) def desactivar_nota(self,pos): dato=self.t_act.dato.index_notas(pos) if not dato: raise ValueError('El track elegido ya esta desactivado') self.t_act.dato.quitar_nota(pos) self.t_act.dato.agregar_nota(False,pos) nota=self.archivo.objeto_sonidos.devolver_posicion(pos) self.t_act.dato.notas_obj.remove(nota) def anadir_marca(self,duracion): tiempo=Tiempo(duracion) for iteracion in range(len(self.archivo.objeto_sonidos)): tiempo.agregar_nota(False) self.archivo.tiempos.append(tiempo) def anadir_marca_next(self,duracion): tiempo=Tiempo(duracion) for iteracion in range(len(self.archivo.objeto_sonidos)): tiempo.agregar_nota(False) posicion=self.archivo.tiempos.index(self.t_act.dato)+1 self.archivo.tiempos.insert(posicion,tiempo) def anadir_marca_prev(self,duracion): tiempo=Tiempo(duracion) for iteracion in range(len(self.archivo.objeto_sonidos)): tiempo.agregar_nota(False) posicion=self.archivo.tiempos.index(self.t_act.dato)-1 self.archivo.tiempos.insert(posicion,tiempo) nodo=self.archivo.tiempos.obtener_nodo(posicion) self.pila.apilar(nodo)
''' Pila Una pila es una lista ordenada o estructura de datos en la que el modo de acceso a sus elementos es de tipo 'LIFO' (Last in First Out, Ultimo en Entrar es el Primero en Salir) que permite almacenar datos. Para el manejo de los datos se cuenta con dos operaciones basicas: apilar(push), que coloca un objeto en la pila, y su opeacion inversa, retirar(o desapilar, pop), que retira el ultimo elemento apilado. OPERACIONES: Crear: Se crea una pila vacia (constructor) Tamaño: Regresa el numero de elementos de la pila (size) Apilar: Se añade un elemento a la pila (push) Desapilar: Se elimina el elemento frontal de la pila (pop) Cima: Devuelve el elemento que esta en la cima de la pila (top o peek) Vacia: Devuelve True si la pila esta sin elementos o False en caso de que contenga alguno (empty) Las pilas pueden ser de tamaño estatico y dinamico, se pueden implementar en listas, arreglos, colecciones de datos o el listas enlazadas ''' from Pila import Pila pila = Pila(5) pila.push(25) pila.push(12) pila.push(57) pila.show() print(pila.top())
# Copyright 2016 Yorlys Oropeza <yorlys@debian> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. # # from Pila import Pila pila = Pila(5) pila.push(23) pila.push(90) pila.push(45) pila.show() pila.pop() pila.show()
_autor_ = 'Enrique Bello' from Pila import Pila pila = Pila(6) pila.push(20) pila.push(49) pila.push(110) pila.push(159) pila.push(196) pila.push(200) pila.push(284) #pila.pop() pila.show() print("Size: %d" % (pila.Size())) print("Estado:", pila.empty()) print("Top: %d" % (pila.Top()))
#listaCaracteres = [] listaCaracteres = cadena.split(' ') return listaCaracteres def crearArbol(lista, pila): for i in range(0, len(lista)): if lista[i] in "+-*/": der = pila.sacarElemento() izq = pila.sacarElemento() nodoAux = Nodo(lista[i], izq, der) pila.agregarElemento(nodoAux) else: pila.agregarElemento(Nodo(int(lista[i]), None, None)) return pila.sacarElemento() def imprimirArbolPostfijo(arbol): if arbol != None: imprimirArbolPostfijo(arbol.izq) imprimirArbolPostfijo(arbol.der) print arbol.valor cadena = leerCadena() pila = Pila() nodo = crearArbol(cadena, pila) print "impresion de Arbol:" imprimirArbolPostfijo(nodo) print "Resultado operacion: ", evaluar(nodo)
def __init__(self,archivo): self.archivo=archivo self.t_act=self.archivo.tiempos.prim self.pos_t=0 self.pila=Pila()
def __init__(self, prim): self.actual = prim self.pila_auxiliar = Pila() self.posicion = 0
def Simulador_Automata_lento(self): self.label.clear() self.Palabra.setEnabled(False) self.Verifica_rapido.setEnabled(False) self.Verifica_Lento.setEnabled(False) self.imagen_robot.setPixmap(QtGui.QPixmap("automata_imagen.png")) palabra=self.Palabra.text()+"#" Pila_Valida=Pila() Pila_Valida.apilar("#") engine = pyttsx3.init() rate = engine.getProperty('rate') engine.setProperty('rate', rate-60) estado_actual="q0" bandera=1 self.label.setStyleSheet("font: 75 20pt \"MS Shell Dlg 2\";""color: green") mostrando_cadena_recorrida="" for caracter in palabra: #(a/#/#a) if Pila_Valida.tope()=="#" and caracter=="a" and estado_actual=="q0": mostrando_cadena_recorrida="a" self.Tr10.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("#") Pila_Valida.apilar("a") engine.say("Estado inicial q0. leyendo una a") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr10.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem(caracter) for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #(a/a/aa) elif Pila_Valida.tope()=="a" and caracter=="a" and estado_actual=="q0": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"a" QtTest.QTest.qWait(1000) self.Tr6.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("a") Pila_Valida.apilar("a") engine.say("continúa en Estado inicial q0. leyendo una a") engine.runAndWait() QtTest.QTest.qWait(1000) self.label.setText(caracter+caracter) self.Tr6.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem(caracter) for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #(b/a/ab) elif Pila_Valida.tope()=="a" and caracter=="b" and estado_actual=="q0": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"b" self.Tr8.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("a") Pila_Valida.apilar("b") engine.say("continúa en Estado inicial q0. leyendo una b") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr8.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem(caracter) for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #(c/b/b) elif Pila_Valida.tope()=="b" and caracter=="c" and estado_actual=="q0": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"c" self.Tr11.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" Pila_Valida.desapilar() Pila_Valida.apilar("b") engine.say("pasa al estado q1. leyendo una c") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr11.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem("b") for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #(b/b/λ) elif Pila_Valida.tope()=="b" and caracter=="b" and estado_actual=="q1": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"b" QtTest.QTest.qWait(1000) self.Tr1.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" Pila_Valida.desapilar() engine.say("continúa en Estado q1. leyendo una b") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr1.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem(caracter) for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #(a/a/λ) elif Pila_Valida.tope()=="a" and caracter=="a" and estado_actual=="q1": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"a" QtTest.QTest.qWait(1000) self.Tr4.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" Pila_Valida.desapilar() engine.say("continúa en estado q1. leyendo una a") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr4.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem(caracter) for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #(λ/#/#) elif Pila_Valida.tope()=="#" and estado_actual=="q1" and bandera==len(palabra): #self.label.setText(mostrando_cadena_recorrida) self.Tr3.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Aceptacion.jpg")) estado_actual="q2" QtTest.QTest.qWait(1000) self.Tr3.setStyleSheet("color: rgb(0, 0, 0);") engine.say("pasa al Estado De aceptacion leyendo vacío. La palabra es palindrome") engine.runAndWait() self.label.setText("SI ES PALINDROME") bandera=bandera+1 self.imagen_robot.setPixmap(QtGui.QPixmap("automata_imagen_aceptada.png")) self.listWidget.addItem("#") #self.Palabra.setStyleSheet("background-color: rgb(207,232, 162);") self.label.setVisible(True) msg=QtWidgets.QMessageBox() msg.setText("ES PALINDROME") msg.setStyleSheet("color: green") msg.show() msg.exec() self.label.clear() self.Verifica_rapido.setEnabled(True) self.Verifica_Lento.setEnabled(True) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) self.Palabra.setEnabled(True) #(b/#/#b) elif Pila_Valida.tope()=="#" and caracter=="b" and estado_actual=="q0": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"b" self.Tr5.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("#") Pila_Valida.apilar("b") engine.say("Estado inicial q0. leyendo una b") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr5.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem(caracter) for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #(c/#/#) elif Pila_Valida.tope()=="#" and caracter=="c" and estado_actual=="q0": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"c" self.Tr12.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" engine.say("pasa al estado q1. leyendo una c") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr12.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #b/b/bb elif Pila_Valida.tope()=="b" and caracter=="b" and estado_actual=="q0": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"b" QtTest.QTest.qWait(1000) self.Tr9.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("b") Pila_Valida.apilar("b") engine.say("continúa en Estado inicial q0. leyendo una b") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr9.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem(caracter) for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #(c/a/a) elif Pila_Valida.tope()=="a" and caracter=="c" and estado_actual=="q0": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"c" self.Tr2.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" Pila_Valida.desapilar() Pila_Valida.apilar("a") engine.say("pasa al estado q1. leyendo una c") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr2.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem("a") for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) #(a/b/ba) elif Pila_Valida.tope()=="b" and caracter=="a" and estado_actual=="q0": mostrando_cadena_recorrida=mostrando_cadena_recorrida+"a" self.Tr7.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("b") Pila_Valida.apilar("a") engine.say("continúa en Estado inicial q0. leyendo una a") engine.runAndWait() QtTest.QTest.qWait(1000) self.Tr7.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 self.label.setText(mostrando_cadena_recorrida) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() self.listWidget.addItem(caracter) for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) else: mostrando_cadena_recorrida=mostrando_cadena_recorrida+caracter engine.say("Se quedó sin camino y no finalizó en un estado de aceptacion") engine.runAndWait() self.label.setText(mostrando_cadena_recorrida) self.label.setStyleSheet("color: red;") self.imagen_robot.setPixmap(QtGui.QPixmap("automata_imagen_denegado.jpg")) msg=QtWidgets.QMessageBox() msg.setText("se quedó sin camino NO ES PALINDROME") msg.setStyleSheet("color: red") msg.show() msg.exec() msg=QtWidgets.QMessageBox() break if estado_actual != "q2": engine.say("No es palindrome") engine.runAndWait() self.label.setText("NO ES PALINDROME") self.label.setStyleSheet("color: red") msg=QtWidgets.QMessageBox() msg.setText("debe ser de la forma: ZcZ^(-1), Z=(a*,b*)") msg.setStyleSheet("color: red") msg.show() msg.exec() self.label.clear() self.Automata.setPixmap(QtGui.QPixmap("Imagen1_Automata.jpg")) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() if caracter != "c": self.listWidget.addItem(caracter) for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) else: for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) self.Verifica_rapido.setEnabled(True) self.Verifica_Lento.setEnabled(True) self.Palabra.setEnabled(True)
def crear_pila_vacia(): obj = Pila() return obj
if arbol.valor == "+": return evaluar(arbol.izq) + evaluar(arbol.der) if arbol.valor == "-": return evaluar(arbol.izq) - evaluar(arbol.der) if arbol.valor == "/": return evaluar(arbol.izq) / evaluar(arbol.der) if arbol.valor == "*": return evaluar(arbol.izq) * evaluar(arbol.der) return int(arbol.valor) class Nodo(): def __init__(self, val, izq=None, der=None): self.valor = val self.izq = izq self.der = der if __name__ == "__main__": f = open('expresiones.in', 'r') pf = f.read().split() print(pf) f.close() p = Pila() convertir(pf, p) fin = p.es_vacia f2 = open("expresiones.out", "w") while (p.es_vacia() == False): f2.write(str(evaluar(p.desapilar())) + '\n') f2.close()
def Simulador_Automata_rapido(self): self.listWidget.clear() self.Palabra.setEnabled(False) self.Verifica_rapido.setEnabled(False) self.Verifica_Lento.setEnabled(False) self.imagen_robot.setPixmap(QtGui.QPixmap("automata_imagen.png")) palabra=self.Palabra.text()+"#" Pila_Valida=Pila() Pila_Valida.apilar("#") engine = pyttsx3.init() rate = engine.getProperty('rate') engine.setProperty('rate', rate-60) estado_actual="q0" bandera=1 for caracter in palabra: #(a/#/#a) if Pila_Valida.tope()=="#" and caracter=="a" and estado_actual=="q0": self.Tr10.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("#") Pila_Valida.apilar("a") self.Tr10.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #(a/a/aa) elif Pila_Valida.tope()=="a" and caracter=="a" and estado_actual=="q0": self.Tr6.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("a") Pila_Valida.apilar("a") self.Tr6.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #(b/a/ab) elif Pila_Valida.tope()=="a" and caracter=="b" and estado_actual=="q0": self.Tr8.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("a") Pila_Valida.apilar("b") self.Tr8.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #(c/b/b) elif Pila_Valida.tope()=="b" and caracter=="c" and estado_actual=="q0": self.Tr11.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" Pila_Valida.desapilar() Pila_Valida.apilar("b") self.Tr11.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #(b/b/λ) elif Pila_Valida.tope()=="b" and caracter=="b" and estado_actual=="q1": QtTest.QTest.qWait(1000) self.Tr1.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" Pila_Valida.desapilar() self.Tr1.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #(a/a/λ) elif Pila_Valida.tope()=="a" and caracter=="a" and estado_actual=="q1": QtTest.QTest.qWait(1000) self.Tr4.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" Pila_Valida.desapilar() self.Tr4.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #(λ/#/#) elif Pila_Valida.tope()=="#" and estado_actual=="q1" and bandera==len(palabra): self.Tr3.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Aceptacion.jpg")) estado_actual="q2" self.Tr3.setStyleSheet("color: rgb(0, 0, 0);") #self.Palabra.setStyleSheet("background-color: rgb(207,232, 162);") self.imagen_robot.setPixmap(QtGui.QPixmap("automata_imagen_aceptada.png")) engine.say("palindrome") engine.runAndWait() self.label.setText("SI ES PALINDROME") self.label.setStyleSheet("color: GREEN") bandera=bandera+1 self.label.setVisible(True) msg=QtWidgets.QMessageBox() msg.setText("ES PALINDROME") msg.setStyleSheet("color: green") msg.show() msg.exec() self.label.setVisible(True) self.Verifica_rapido.setEnabled(True) self.Verifica_Lento.setEnabled(True) self.Palabra.setEnabled(True) #(b/#/#b) elif Pila_Valida.tope()=="#" and caracter=="b" and estado_actual=="q0": self.Tr5.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("#") Pila_Valida.apilar("b") self.Tr5.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #(c/#/#) elif Pila_Valida.tope()=="#" and caracter=="c" and estado_actual=="q0": self.Tr12.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" self.Tr12.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #b/b/bb elif Pila_Valida.tope()=="b" and caracter=="b" and estado_actual=="q0": self.Tr9.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("b") Pila_Valida.apilar("b") self.Tr9.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #(c/a/a) elif Pila_Valida.tope()=="a" and caracter=="c" and estado_actual=="q0": self.Tr2.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen3_Automata.jpg")) estado_actual="q1" Pila_Valida.desapilar() Pila_Valida.apilar("a") self.Tr2.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 #(a/b/ba) elif Pila_Valida.tope()=="b" and caracter=="a" and estado_actual=="q0": self.Tr7.setStyleSheet("color: rgb(11, 143, 38);") self.Automata.setPixmap(QtGui.QPixmap("Imagen2_Automata.jpg")) estado_actual="q0" Pila_Valida.desapilar() Pila_Valida.apilar("b") Pila_Valida.apilar("a") self.Tr7.setStyleSheet("color: rgb(0, 0, 0);") bandera=bandera+1 else: engine.say("No palindrome") engine.runAndWait() self.imagen_robot.setPixmap(QtGui.QPixmap("automata_imagen_denegado.jpg")) msg=QtWidgets.QMessageBox() msg.setText("se quedó sin camino NO ES PALINDROME") msg.setStyleSheet("color: red") msg.show() msg.exec() break if estado_actual != "q2": self.label.setText("NO ES PALINDROME") self.label.setStyleSheet("color: red") msg=QtWidgets.QMessageBox() msg.setText("debe ser de la forma: ZcZ^(-1), Z=(a*,b*)") msg.show() msg.setStyleSheet("color: red") msg.exec() self.label.setVisible(False) self.Automata.setPixmap(QtGui.QPixmap("Imagen1_Automata.jpg")) Tamaño_list=Pila_Valida.tamano() self.listWidget.clear() for i in range(1,Tamaño_list+1): self.listWidget.addItem(Pila_Valida.mostrar()[Tamaño_list-i]) self.Verifica_rapido.setEnabled(True) self.Verifica_Lento.setEnabled(True) self.Palabra.setEnabled(True)