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 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 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 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 locevanje(sklad): '''vrne seznam desetih skladov''' obrat = Sklad() seznam = [Sklad() for i in range(10)] 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 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 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 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 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 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 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): '''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 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 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 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 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 odstrani_najvecje(self): """ Iz sklada odstrani vse najvecje elemente """ naj = 0 pomozen = Sklad() while not self.prazen(): el = self.vrh() self.odstrani() if el > naj: naj = el pomozen.vstavi(el) while not pomozen.prazen(): el = pomozen.vrh() if el != naj: self.vstavi(el) pomozen.odstrani()
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()
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 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 max_globina(niz): '''Poišče globino najbolj globoko gnezdenega para oklepajev.''' sklad = Sklad() globina = 0 naj_globina = 0 for znak in niz: if znak in OKLEPAJI: sklad.vstavi(znak) globina += 1 if globina > naj_globina: naj_globina = globina elif znak in OKLEPAJI.values(): if sklad.prazen(): return None if not OKLEPAJI[sklad.poberi()] == znak: return None globina -= 1 if not sklad.prazen(): return None return naj_globina
def odstrani_najstarejsega_najvecjega(self): """ Iz sklada odstrani najstarejsi najvecji element """ naj = 0 pomozen = Sklad() while not self.prazen(): el = self.vrh() self.odstrani() if el > naj: naj = el pomozen.vstavi(el) while not pomozen.prazen(): el = pomozen.vrh() if el == naj: naj = '' else: self.vstavi(el) pomozen.odstrani()
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
def vrednost(izraz): '''while there are tokens to be read: read a token. if the token is a number, then push it to the output queue. if the token is an operator, then: while there is an operator at the top of the operator stack with greater than or equal to precedence and the operator is left associative: pop operators from the operator stack, onto the output queue. push the read operator onto the operator stack. if the token is a left bracket (i.e. "("), then: push it onto the operator stack. if the token is a right bracket (i.e. ")"), then: while the operator at the top of the operator stack is not a left bracket: pop operators from the operator stack onto the output queue. pop the left bracket from the stack. /* if the stack runs out without finding a left bracket, then there are mismatched parentheses. */ if there are no more tokens to read: while there are still operator tokens on the stack: /* if the operator token on the top of the stack is a bracket, then there are mismatched parentheses. */ pop the operator onto the output queue. exit.''' sklad_operacij,sklad_vrednosti = Sklad(),Sklad() for znak in cleni_izraza(izraz): if znak.isdigit(): sklad_vrednosti.vstavi(int(znak)) elif znak in {'+','*','**'}: while sklad_ima_prednost(sklad_operacij, znak): izvedi_racun(sklad_operacij, sklad_vrednosti) sklad_operacij.vstavi(znak) elif znak == '(': sklad_operacij.vstavi(znak) elif znak == ')': while sklad_operacij.vrh() != '(': izvedi_racun(sklad_operacij, sklad_vrednosti) sklad_operacij.odstrani() while not sklad_operacij.prazen(): izvedi_racun(sklad_operacij, sklad_vrednosti) return sklad_vrednosti.vrh()
def obrni_k_elementov(vrsta, k): """ Podano vrsto spremeni tako, da obrne prvih k clenov, ostale pa pusti v istem vrstnem redu. """ if k < 0 or vrsta.velikost() < k: raise ValueError('Napaka pri vhodnih podatkih') if vrsta.velikost() == 0 and k > 0: raise ValueError('Napaka pri vhodnih podatkih') pomozni_sklad = Sklad() for _ in range(k): pomozni_sklad.vstavi(vrsta.prvi()) vrsta.izbrisi() while not pomozni_sklad.prazen(): vrsta.dodaj(pomozni_sklad.vrh()) pomozni_sklad.odstrani() for _ in range(vrsta.velikost() - k): vrsta.dodaj(vrsta.prvi()) vrsta.izbrisi()
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')