Cod sursa(job #2868793)

Utilizator qmpzasdasdasdad qmpzasd Data 11 martie 2022 10:33:20
Problema Evaluarea unei expresii Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 2.28 kb
# xplicati cum puteti implementa o stiva cu 2 cozi (complexitatea operatilor push si pop)/ implementare optionala
# Evaluare  pe IA
# daca vreti sa implementati problema de la seminar cu petrecerea: https://www.spoj.com/problems/STPAR/
# Cei care au SI trebuie sa returneze pana pe 15 martie, cei care au SP pana pe 22 martie
# Consideram o stiva si doua cozi, A si B. Initial, push-ul se face in coada A in mod normal, in O(1) daca o sa dorim sa dam pop la un element din coada va trebui sa mutam aproape toate elementele in coada B si cand coada A mai are un element, atunci o sa il aruncam.(operatia are O(n), unde n e numarul de elemente din coada). In configuratia curenta, daca dorm sa dam iar pop trebuie sa repetam operatiuinea. Daca dorim un push, in premiera, o sa adaugam elementul in stiva A, nu B. pentru ca, cu cat mai putine elemente in coada ce detine ultimul element adaugat, cu atat o sa trebuiasca sa mutam mai putine elemente pentru a face un pop. Acest pop cu doua cozi in care varful se afla in coada A, se poate efectua astfel:
# -mutam toate elementele din A in B, mai putin ultimul element, pe care in stergem , iar toate elementele ce erau initial in B, acum vor fi transferate in A.
# In acelasi timp daca stim numarul de elemente care vor fi adaugate in stiva, am putea sa adaugam jumatate in A si jumatate in B pentru eficienta maxima.  


def calculate( s):
    arr=[]
    for c in s:
        arr.append(c)
    return helper(arr)

def helper( s):
    if len(s) == 0:
        return 0
    stack = []
    sign = '+'
    num = 0
    while len(s) > 0:
        c = s.pop(0)
        if c.isdigit():
            num = num*10+int(c)
        if c == '(':
            # do recursion to calculate the sum within the next (...)
            num = helper(s)
        if len(s) == 0 or (c == '+' or c == '-' or c == '*' or c == '/' or c == ')'):
            if sign == '+':
                stack.append(num)
            elif sign == '-':
                stack.append(-num)
            elif sign == '*':
                stack[-1] = stack[-1]*num
            elif sign == '/':
                stack[-1] = int(stack[-1]/float(num))
            sign = c
            num = 0
            if sign == ')':
                break
    return sum(stack)


open('evaluare.out','w').write(str(calculate(open('evaluare..in').read())))