Вам РПН размер дерева
Я реализовал следующий "сортировщик деревьев", но он не работает при определенных условиях, пример ниже возвращает размер 2, когда он должен вернуть размер 4, может кто-нибудь помочь мне. Я писал это несколько раз, но безрезультатно, оно все время терпит неудачу. Заранее спасибо
JC
def getRPNdepth(expression):
treesize=0
maxtreesize=treesize
mintreesize=treesize
tmpexp=expression
tmpfmla = [1 if n[0] == 'x' else n for n in tmpexp]
print(tmpfmla)
try:
stack = []
for val in tmpfmla:
if val in ['-', '+', '*', '/']:
op1 = stack.pop()
op2 = stack.pop()
if val == '-': result = op2 - op1
if val == '+': result = op2 + op1
if val == '*': result = op2 * op1
if val == '/':
if op1 == 0:
result = 1
else:
result = op2 / op1
stack.append(result)
treesize=treesize+1
else:
stack.append(float(val))
treesize = treesize - 1
if treesize>maxtreesize:
maxtreesize=treesize
if treesize<mintreesize:
mintreesize=treesize
return abs(mintreesize)
except:
print('error validate rpn>' + str(expression))
return 0
xxxx = ['x6', 'x7', '+', 'x7', '+', 'x7', '+', 'x7', '+']
print(getRPNdepth(xxxx))
Пара примеров : ['1','1' ,'+','1','1' ,'+' ,'+'] ['1','1','1' ,'+' ,'+'] оба дают результат 3, что правильно, но. ['1','1' ,'+','1','1' ,'+' ,'+'] возвращает 3, когда это должно быть 4
В общем, мне нужно знать глубину RPN из его строкового представления.
2 ответа:
Вычисление глубины дерева аналогично вычислению выражения, но операторы вычисляют результирующие глубины вместо результирующих значений:
def getRPNdepth(expression): stack = [] for val in expression: if val in ['-', '+', '*', '/']: stack.append(max(stack.pop(),stack.pop())+1) else: stack.append(1) return stack.pop()
Ну, просто сделал немного "обмана" и использовал мой rpn для инфикс-конвертера для достижения той же цели, я размещаю его здесь, если кому-то это нужно.
def getRPNdepth(expression): tmpexp = expression tmpfmla = [1 if n[0] == 'x' else n for n in tmpexp] stack = [] for val in tmpfmla: if val!=' ': if val in ['-', '+', '*', '/']: op1 = stack.pop() op2 = stack.pop() stack.append('(' + str(op1) + str(val) + str(op2) + ')') else: stack.append(str(val)) openparentesiscount=0 maxopenparentesiscount = 0 onlyparentesis='' for c in stack[0]: if c in ['(', ')']: onlyparentesis=onlyparentesis+c if c=='(': openparentesiscount=openparentesiscount+1 else: openparentesiscount = openparentesiscount - 1 if openparentesiscount>maxopenparentesiscount: maxopenparentesiscount=openparentesiscount return maxopenparentesiscount
Спасибо всем !