예제 #1
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()
예제 #2
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
예제 #3
0
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()
예제 #4
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()
예제 #5
0
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
예제 #6
0
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
예제 #7
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
 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()
예제 #10
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()
예제 #11
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
예제 #12
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()
예제 #13
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
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
예제 #15
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()
예제 #16
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
예제 #17
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
예제 #18
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
예제 #19
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
예제 #20
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
예제 #21
0
    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()
예제 #22
0
    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()
예제 #24
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()
예제 #25
0
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
예제 #26
0
    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()
예제 #27
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
예제 #28
0
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')