Pagini recente » Rating Tepes-Onea Filip (mast3r98) | Cod sursa (job #168793) | Cod sursa (job #2436756) | Cod sursa (job #320707) | Cod sursa (job #2868793)
# 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())))