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 pregled_po_skladu(zacetno_drevo): '''pregleda drevo s skladom''' sklad = Sklad() sklad.vstavi(zacetno_drevo) while not sklad.prazen(): drevo = sklad.poberi() if not drevo.prazno: sklad.vstavi(drevo.levo) sklad.vstavi(drevo.desno) yield drevo.podatek
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 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 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 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 vrednost_rpn(niz): '''Izračuna vrednost RPN izraza preko tega, da po dve števili shranjujemo v sklad.''' s = Sklad() for znak in niz.split(): try: int(znak) s.vstavi(znak) # Število dodamo v sklad except: prvoSt = s.poberi() drugoSt = s.poberi() s.vstavi(str(eval(prvoSt + znak + drugoSt))) return int(s.poberi())
def upor_vezja(niz): '''Izračuna upor vezja s pomočjo sklada.''' print(niz) sklad = Sklad() for znak in niz.split(): if znak in 'VZ': drugiEl = sklad.poberi() prviEl = sklad.poberi() sklad.vstavi(nadomestni_upor(float(prviEl), float(drugiEl), znak)) else: # Imamo število sklad.vstavi(float(znak)) return sklad.poberi()
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 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
def obicajni_zapis(izraz): '''Vrne običanji zapis računanja.''' sklad = Sklad() obicajni_izraz = '' for znak in izraz.split(): try: int(znak) sklad.vstavi(znak) # Število dodamo v sklad except: drugiIzraz = sklad.poberi() prviIzraz = sklad.poberi() obicajni_izraz sklad.vstavi('({0} {1} {2})'.format(prviIzraz, znak, drugiIzraz)) return sklad.poberi()
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 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 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 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): '''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 nadomestni_upor(r1, r2, tipV): '''Vrne nadomestni upor vezja. Argumenta sta dve stevili r1 in r2 ter tip vezave, ki je bodisi znak 'V' ali 'Z' ''' sklad = Sklad() if tipV == 'Z': return r1 + r2 if tipV == 'V': if 0 in (r1, r2): return 0 return (r1 * r2) / (r1 + r2)
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 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 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 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): 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 odstrani_najmlajsega_najvecjega(self): '''odstrani najmlajsega najvecjega''' if self.prazen(): return None st = 0 naj = float('-inf') pomozni = Sklad() while not self.prazen(): #preložim v pomožnega el = self.vrh() pomozni.vstavi(el) if self.vrh() > naj: naj = self.vrh() st = 1 elif self.vrh() == naj: st += 1 self.odstrani() while not pomozni.prazen(): if naj == pomozni.vrh(): st -= 1 if st > 0: self.vstavi(pomozni.vrh()) else: self.vstavi(pomozni.vrh()) pomozni.odstrani()
def poisci_sobo(skladisce, pot, smer=None): '''Vrne iskano sobo ter skladišče s po potrebi dodanimi praznimi sobami.''' if skladisce.prazno: if smer == 'L': skladisce = Drevo(Vrsta()) elif smer == 'D': skladisce = Drevo(Sklad()) if pot == '': return skladisce, skladisce.podatek elif pot[0] == 'L': levo_skladisce, soba = poisci_sobo(skladisce.levo, pot[1:], smer='L') return Drevo(skladisce.podatek, levo=levo_skladisce, desno=skladisce.desno), soba elif pot[0] == 'D': desno_skladisce, soba = poisci_sobo(skladisce.desno, pot[1:], smer='D') return Drevo(skladisce.podatek, levo=skladisce.levo, desno=desno_skladisce), soba
def prestej_elemente(self): '''Prešteje elemente s pomočjo metode pop in pomožnega sklada''' i = 0 pomozni = Sklad() while not self.prazen(): pomozni.vstavi(self.pop()) i += 1 while not pomozni.prazen(): self.vstavi(pomozni.pop()) return i
def oklepaji(niz): '''Preveri, ali so oklepaji pravilno gnezdeni. Uporaba sklada.''' sklad = Sklad() for znak in niz: if znak in OKLEPAJI: sklad.vstavi(znak) elif znak in OKLEPAJI.values(): if sklad.prazen(): return False if not OKLEPAJI[sklad.poberi()] == znak: return False if not sklad.prazen(): return False return True
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 odstrani_najstarejsega_najvecjega(self): ''''iz sklada odstrani najstarejsi najvecji element''' 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: najvecji = '' else: self.vstavi(vrh) sklad.odstrani()