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
예제 #2
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 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
예제 #4
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()
예제 #5
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()
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
예제 #7
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 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
예제 #9
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()
예제 #10
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()
예제 #11
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()
예제 #12
0
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()
예제 #13
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
예제 #14
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()
예제 #15
0
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
예제 #16
0
파일: vlak.py 프로젝트: jakobvalic/RAC-1
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
예제 #17
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 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
예제 #19
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()
예제 #20
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()
예제 #21
0
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
예제 #22
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 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()
예제 #25
0
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
예제 #26
0
    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()
예제 #27
0
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
예제 #28
0
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()
예제 #29
0
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
예제 #30
0
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