def je_lahko_BST(pre): '''preveri ali premi pregled lahko predstavlja dvojiško iskalno drevo''' s = Sklad() # Trenutni koren = -inf koren = float('-inf') # Sprehodi se čez seznam for vrednost in pre: #Opomba:vrednost = pre[i] po #danem algoritmu # Če najdemo vrednost, ki je manjša od korena, vrni False if vrednost < koren: return False # Če je vrednost(pre[i]) v desnem poddrevesu # Odstrani elemente, ki so manjši kot je koren # in naredi zadnjega kot koren while not s.prazen() and s.vrh() < vrednost: koren = s.vrh() s.odstrani() # Na tej točki je sklad prazen ali je vrednost manjša # od korena, vstavi vrendost s.vstavi(vrednost) return True
def odstrani_naj_sklad(s): '''Odstrani najkrajši niz iz sklada če je takih elementov več odstrani le vrhnjega''' dolzina = float('inf') sk = Sklad() #pomožni sklad prvi = True while not s.prazen(): niz = s.vrh() dolzina = min(len(niz), dolzina) s.odstrani() sk.vstavi(niz) while not sk.prazen(): niz = sk.vrh() sk.odstrani() s.vstavi(niz) while not s.prazen(): if prvi and len(s.vrh()) == dolzina: prvi = False else: sk.vstavi(s.vrh()) s.odstrani() while not sk.prazen(): s.vstavi(sk.vrh()) sk.odstrani() return
def upor_vezja(niz): """Izracuna nadomestni upor vezja, ki je podano kot niz operacij npr (3 5 Z 0 V 3 2 Z V)""" sklad_uporov = Sklad() for znak in niz.split(' '): if znak in 'ZV': prvi = sklad_uporov.vrh() sklad_uporov.odstrani() drugi = sklad_uporov.vrh() sklad_uporov.odstrani() sklad_uporov.vstavi(nadomestni_upor(prvi, drugi, znak)) else: sklad_uporov.vstavi(int(znak)) return sklad_uporov.vrh()
def stari_macki(niz): '''nadomestni upor vezja izracuna po metodi stari macki''' sklad = Sklad() for znak in niz.split(' '): if znak in 'ZV': prvi_el = sklad.vrh() sklad.odstrani() drugi_el = sklad.vrh() sklad.odstrani() sklad.vstavi(nadomestni_upor_SM(prvi_el, drugi_el, znak)) else: sklad.vstavi(int(znak)) return sklad.vrh()
def obicajni_zapis(niz): sklad_stevil = Sklad() sez = niz.split() for c in sez: if c not in '+*': sklad_stevil.vstavi(c) else: st1 = sklad_stevil.vrh() sklad_stevil.odstrani() st2 = sklad_stevil.vrh() sklad_stevil.odstrani() sklad_stevil.vstavi("({} {} {})".format(st2, c, st1)) return sklad_stevil.vrh()
def stari_macki(niz): '''vrne upor po metodi starih mačkov''' sklad = Sklad() tab = niz.strip().split(' ') for el in tab: if el in {'V', 'Z'}: r1 = sklad.vrh() sklad.odstrani() r2 = sklad.vrh() sklad.odstrani() sklad.vstavi(nadomestni_macki_formula(r1, r2, el)) else: sklad.vstavi(int(el)) return sklad.vrh()
def upor_vezja(niz): '''Izracuna nadomestni upor vezja. Vezje je podano kot niz v "RPN" notaciji''' skladUporov = Sklad() for znak in niz.split(' '): if znak in 'ZV': prvi_el = skladUporov.vrh() skladUporov.odstrani() drugi_el = skladUporov.vrh() skladUporov.odstrani() skladUporov.vstavi(nadomestni_upor(prvi_el, drugi_el, znak)) else: skladUporov.vstavi(int(znak)) return skladUporov.vrh()
def vrednost_rpn(niz): sklad_stevil = Sklad() sez = niz.split() for c in sez: if c not in '+*': sklad_stevil.vstavi(c) else: st1 = sklad_stevil.vrh() sklad_stevil.odstrani() st2 = sklad_stevil.vrh() sklad_stevil.odstrani() rez = izracunaj(st1, st2, c) sklad_stevil.vstavi(rez) return int(sklad_stevil.vrh())
def odstrani_najvecje(self): '''Odstrani vse največje''' if self.prazen(): return None naj = float('-inf') pomozni = Sklad() while not self.prazen(): el = self.vrh() self.odstrani() naj = max(el, naj) pomozni.vstavi(el) while not pomozni.prazen(): if naj != pomozni.vrh(): self.vstavi(pomozni.vrh()) pomozni.odstrani()
def upor_vezja(niz): '''Vrne nadomestni upor''' sklad_uporov = Sklad() sez = niz.strip().split(' ') for el in sez: if el not in {'V', 'Z'}: sklad_uporov.vstavi(int(el)) else: r1 = sklad_uporov.vrh() sklad_uporov.odstrani() r2 = sklad_uporov.vrh() sklad_uporov.odstrani() rez = nadomestni_upor(r1, r2, el) sklad_uporov.vstavi(rez) return sklad_uporov.vrh()
def sestavi_racun(niz): '''Vrne račun''' sklad = Sklad() tab = niz.strip().split(' ') for el in tab: if el in {'V', 'Z'}: r1 = sklad.vrh() sklad.odstrani() r2 = sklad.vrh() sklad.odstrani() upor = nadomestni_formula(r1, r2, el) sklad.vstavi(upor) else: sklad.vstavi(el) return sklad.vrh()
def vzemi_sklad(sklad, kolicina): '''iz sklada vzame število izdelkov ali vrže izjemo''' pom = Sklad() odv_kol = 0 while odv_kol < kolicina and not sklad.prazen(): pom.vstavi(sklad.vrh()) sklad.odstrani() odv_kol += pom.vrh() if odv_kol > kolicina: sklad.vstavi(odv_kol - kolicina) elif odvzeta_kolicina < kolicina: while not pom.prazen(): sklad.vstavi(pom.vrh()) pom.odstrani() raise IndexError
def odstrani_najmlajsega_najvecjega(self): """ Iz sklada odstrani najmlajsi najvecji element """ naj = 0 ponovitve_naj = 0 pomozen = Sklad() while not self.prazen(): el = self.vrh() self.odstrani() if el > naj: naj = el ponovitve_naj = 1 elif el == naj: ponovitve_naj += 1 pomozen.vstavi(el) while not pomozen.prazen(): el = pomozen.vrh() if el == naj: if ponovitve_naj == 1: pomozen.odstrani() continue else: ponovitve_naj -= 1 self.vstavi(el) else: self.vstavi(el) pomozen.odstrani()
def sestavi_racun(niz): """Vrne racun, ki je potreben za izracun nadomestnega upora""" sklad_uporov = Sklad() for znak in niz.split(' '): if znak in 'ZV': prvi = sklad_uporov.vrh() sklad_uporov.odstrani() drugi = sklad_uporov.vrh() sklad_uporov.odstrani() if znak == 'Z': sklad_uporov.vstavi('({0} + {1})'.format(drugi, prvi)) else: sklad_uporov.vstavi('(1/{0} + 1/{1})^-1'.format(drugi, prvi)) else: sklad_uporov.vstavi(znak) return sklad_uporov.vrh()
def uredi_s_skladom(sklad): s = Sklad() skl = Sklad() while not sklad.prazen(): vrh = sklad.vrh() sklad.odstrani() while not s.prazen() and s.vrh() > vrh: sklad.vstavi(s.vrh()) s.odstrani() s.vstavi(vrh) while not s.prazen(): skl.vstavi(s.vrh()) s.odstrani() while not skl.prazen(): sklad.vstavi(skl.vrh()) skl.odstrani() return
def obrni(v): pomozni = Sklad() while not v.prazna(): pomozni.vstavi(v.zacetek()) v.odstrani() while not pomozni.prazen(): v.vstavi(pomozni.vrh()) pomozni.odstrani()
def sestavi_racun(niz): '''sestavi racun, ki ga je potrebno izracunati, da dobimo nadomestni upor vezja''' skladUporov = Sklad() for znak in niz.split(' '): if znak in 'ZV': prvi_el = skladUporov.vrh() skladUporov.odstrani() drugi_el = skladUporov.vrh() skladUporov.odstrani() if znak == 'Z': skladUporov.vstavi('({0} + {1})'.format(drugi_el, prvi_el)) else: skladUporov.vstavi('(1/{0} + 1/{1})^-1'.format( drugi_el, prvi_el)) else: skladUporov.vstavi(znak) return skladUporov.vrh()
def stevilo_mnozenj(izraz, velikost): '''izraz - niz, velikost - slovar {A:(n,m),B:(p,r)} n==p stevilo množenj n*m*r''' st_mnozenj = 0 sklad = Sklad() for znak in izraz: if znak.isalpha(): sklad.vstavi((velikost[znak])) elif znak == ')': p, r = sklad.vrh() sklad.odstrani() n, m = sklad.vrh() sklad.odstrani() if p != m: #dimenzije se ne ujemajo return None st_mnozenj += r * m * n sklad.vstavi((n, r)) return st_mnozenj
def vagoni(prihod, odhod): """Vrne true, ce lahko s pomocjo slepega tira spremenimo zaporedje vlakov iz prihoda v odhod""" slepi_tip = Sklad() prihod = prihod[::-1] for vlak in prihod: if not slepi_tip.prazen() and slepi_tip.vrh() == odhod[-1]: slepi_tip.odstrani() odhod = odhod[:-1] if vlak == odhod[-1]: odhod = odhod[:-1] else: slepi_tip.vstavi(vlak) while not slepi_tip.prazen(): if slepi_tip.vrh() == odhod[-1]: odhod = odhod[:-1] slepi_tip.odstrani() else: return False return slepi_tip.prazen()
def odstrani_najstarejsega_najvecjega(self): '''Odstrani najstarejšega največjega''' if self.prazen(): return None naj = float('-inf') prvi = False pomozni = Sklad() while not self.prazen(): #preložim v pomožnega el = self.vrh() self.odstrani() naj = max(el, naj) pomozni.vstavi(el) while not pomozni.prazen(): if prvi or naj != pomozni.vrh(): self.vstavi(pomozni.vrh()) else: prvi = True pomozni.odstrani()
def oklepaji(niz): s = Sklad() for c in niz: if c in OKLEPAJI: s.vstavi(c) if c in OKLEPAJI.values(): if s.prazen() or OKLEPAJI[s.vrh()] != c: return False s.odstrani() return s.prazen()
def preveri_HTML(ime_dat=''): '''preveri ali je html datoteka pravilno sestavljena''' s = Sklad() for znacka, st in znacke(ime_dat): if st == 1: s.vstavi((znacka, st)) if st == 2: if s.prazen() or znacka != s.vrh()[0]: return False s.odstrani() return s.prazen()
def prestej_elemente(s): pomozen = Sklad() stevec = 0 while not s.prazen(): pomozen.vstavi(s.vrh()) stevec += 1 s.odstrani() while not pomozen.prazen(): s.vstavi(pomozen.vrh()) pomozen.odstrani() return stevec
def vrednost_z_vsemi_oklepaji(izraz): sklad_vrednosti = Sklad() sklad_operacij = Sklad() for znak in cleni_izraza(izraz): if znak in {'+','*','**'}: sklad_operacij.vstavi(znak) elif znak.isdigit(): sklad_vrednosti.vstavi(int(znak)) elif znak == ')': izvedi_racun(sklad_operacij,sklad_vrednosti) return sklad_vrednosti.vrh()
def permutacija_s_skladom(sez): '''Ali lahko dano permutacijo sestavimo s skladom''' n=0 s = Sklad() for el in sez: while n < el: n+=1 s.vstavi(n) if s.prazen() or el != s.vrh(): return False s.odstrani() return True
def stevilo_mnozenj(izraz, velikost): """Vrne stevilo mnozenj, ki so potrebna za izracun izraza, v primeru da se izraza ne da izracunati vrne none""" zaporedje_matrik = Sklad() st_operacij = 0 for znak in izraz: if znak == '(': continue if znak == ')': desna_matrika = zaporedje_matrik.vrh() zaporedje_matrik.odstrani() leva_matrika = zaporedje_matrik.vrh() zaporedje_matrik.odstrani() if velikost[leva_matrika][1] != velikost[desna_matrika][0]: return None else: st_operacij += velikost[leva_matrika][0] * velikost[leva_matrika][1] * velikost[desna_matrika][1] velikost[leva_matrika + desna_matrika] = (velikost[leva_matrika][0], velikost[desna_matrika][1]) zaporedje_matrik.vstavi(leva_matrika + desna_matrika) else: zaporedje_matrik.vstavi(znak) return st_operacij
class Vrsta: def __init__(self): self.sklad1 = Sklad() self.sklad2 = Sklad() def vstavi(self, vsebina): self.sklad1.vstavi(vsebina) def prazna(self): return self.sklad1.prazen() and self.sklad2.prazen() def prelozi(self): '''Premakne vse iz sklada1 v sklad2''' if self.sklad2.prazen(): while not self.sklad1.prazen(): self.sklad2.vstavi(self.sklad1.vrh()) self.sklad1.odstrani() def izberi_element(self): if self.sklad1.prazen(): raise Exception('Skladovnica je prazna') if self.sklad2.prazen(): self.premakni_sklad1_v_sklad2() return self.sklad2.vrh() def odstrani(self): self.prelozi() if self.sklad2.prazen(): raise IndexError('Skladovnica je prazna') else: self.sklad2.odstrani() def zacetek(self): self.prelozi() if not self.sklad2.prazen(): return self.sklad2.vrh() else: raise IndexError('Vrsta je prazna')
def locevanje(sklad): seznam = [Sklad() for i in range(10)] obrat = Sklad() while not sklad.prazen(): obrat.vstavi(sklad.vrh()) sklad.odstrani() while not obrat.prazen(): x = obrat.vrh() obrat.odstrani() sklad.vstavi(x) seznam[(x % 10)].vstavi(x) return seznam
def oklepaji(niz): """Preveri, ali so v danem nizu oklepaji pravilno gnezdeni""" sklad_oklepajev = Sklad() oklep = {'(': ')', '{': '}', '[': ']', '<': '>'} for znak in niz: if znak in oklep.keys(): sklad_oklepajev.vstavi(znak) elif znak in oklep.values(): if sklad_oklepajev.prazen( ) or znak != oklep[sklad_oklepajev.vrh()]: return False sklad_oklepajev.odstrani() return sklad_oklepajev.prazen()
def podvoji_sklad(s): podvojen = Sklad() pomozen = Sklad() while not s.prazen(): pomozen.vstavi(s.vrh()) s.odstrani() while not pomozen.prazen(): x = pomozen.vrh() s.vstavi(x) pomozen.odstrani() podvojen.vstavi(x) podvojen.vstavi(x) return podvojen