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()
Beispiel #4
0
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()
Beispiel #5
0
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()
Beispiel #6
0
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()
Beispiel #7
0
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()
Beispiel #8
0
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()
Beispiel #10
0
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()
Beispiel #11
0
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
Beispiel #13
0
    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()
Beispiel #15
0
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
Beispiel #16
0
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()
Beispiel #17
0
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()
Beispiel #18
0
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
Beispiel #19
0
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()
Beispiel #21
0
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()
Beispiel #22
0
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
Beispiel #24
0
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
Beispiel #26
0
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')
Beispiel #28
0
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
Beispiel #29
0
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