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_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 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 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 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 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 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 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 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 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 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 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 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 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
def vagoni(prihod, odhod): '''Vrne True, če lahko z ustrezno permutacijo pridemo do preureditve.''' na_stranskem = '' sklad = Sklad() print(prihod, odhod) for prih, odh in zip(prihod, odhod): if prih != odh: na_stranskem += odh sklad.vstavi(prih) for odh in na_stranskem: if sklad.vrh != odh or sklad.prazen(): return False sklad.odstrani() return True
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 oklepaji(niz): '''Preveri, ali so oklepaji pravilno gnezdeni. Vrne True ali False.''' sklad = Sklad() for znak in niz: if znak in slovar_oklep: # ce je znak v slovarju oklepaji, ga doda v sklad sklad.vstavi(znak) elif znak in slovar_oklep.values(): # ce je znak zaklepaj if sklad.prazen(): return False if not slovar_oklep[sklad.vrh()] == znak: # ce vrh ni enak znaku return False # nasli smo ustrezen par oklepajev sklad.odstrani() return sklad.prazen() # ce je sklad prazen, vrne True, sicer pa False
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): '''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 razmnozi_sklad(s, seznam): '''vrne nov sklad, v katerem se vsak element prvotnega sklada pojavi tolikokrat , kolikor je istolezece st v seznamu''' pomozen = Sklad() razmnozen = Sklad() while not s.prazen(): pomozen.vstavi(s.vrh()) s.odstrani() while not pomozen.prazen(): s.vstavi(pomozen.vrh()) for i in range(seznam.pop()): razmnozen.vstavi(s.vrh()) pomozen.odstrani() return razmnozen
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 locevanje(sklad): '''Vrne seznam desetih skladov, pri cemer i-ti sklad vsebuje tista stevila s sklada sklad, ki dajo ostanek i pri deljenju z 10''' seznam = [Sklad() for i in range(10)] #seznam desedtih skladov obrat = Sklad() #pomozni 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 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 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_najvecje(self): '''iz sklada odstrani vse najvecje elemente''' najvecji = 0 sklad = Sklad() while not self.prazen(): vrh = self.vrh() self.odstrani() if vrh > najvecji: najvecji = vrh sklad.vstavi(vrh) while not sklad.prazen(): vrh = sklad.vrh() if vrh != najvecji: self.vstavi(vrh) sklad.odstrani()
def max_globina(niz): oklep = {'(': ')', '{': '}', '[': ']', '<': '>'} globina = 0 naj_globina = 0 sklad = Sklad() for znak in niz: if znak in oklep.keys(): sklad.vstavi(znak) globina += 1 naj_globina = max(globina, naj_globina) elif znak in oklep.values(): if sklad.prazen() or znak != oklep[sklad.vrh()]: return False sklad.odstrani() globina -= 1 return naj_globina if sklad.prazen() else False
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 max_globina(niz): s = Sklad() naj = 0 trenutna = 0 if not oklepaji(niz): return for c in niz: if c in OKLEPAJI: s.vstavi(c) trenutna += 1 naj = max(trenutna, naj) if c in OKLEPAJI.values(): if s.prazen() or OKLEPAJI[s.vrh()] != c: return s.odstrani() trenutna -= 1 return naj
def vagoni(prihod, odhod): '''Ali se lahko vlaki prerazporedijo''' vhod, izhod, slepi = Sklad(), Sklad(), Sklad() for el in prihod: vhod.vstavi(el) for el in odhod: izhod.vstavi(el) while not izhod.prazen(): nasl = izhod.vrh() izhod.odstrani() while slepi.prazen() or slepi.vrh() != nasl: if vhod.prazen(): return False slepi.vstavi(vhod.vrh()) vhod.odstrani() slepi.odstrani() return True