fromenumimportEnum,autoclassOp(Enum):ADD=auto()SUB=auto()MUL=auto()DIV=auto()NOP=auto()defpriority(op):ifop==Op.ADDorop==Op.SUB:return1elifop==Op.MULorop==Op.DIV:return2else:# op == Op.NOPreturn1defcompute(s):num_stack=[]op_stack=[]defparse_num(s,i):buf=""whilei<len(s)ands[i].isdigit():buf+=s[i]i+=1returnint(buf)defparse_op(s,i):ifi<len(s):op_str=s[i]ifop_str=="+":returnOp.ADDelifop_str=="-":returnOp.SUBelifop_str=="*":returnOp.MULelifop_str=="/":returnOp.DIVreturnOp.NOPdefapply(next_op,num_stack,op_stack):while2<=len(num_stack)and1<=len(op_stack):ifpriority(next_op)<=priority(op_stack[-1]):right=num_stack.pop()op=op_stack.pop()left=num_stack.pop()ifop==Op.ADD:num_stack.append(left+right)elifop==Op.SUB:num_stack.append(left-right)elifop==Op.MUL:num_stack.append(left*right)elifop==Op.DIV:num_stack.append(left/right)else:# op == Op.NOPnum_stack.append(right)else:breaki=0whilei<len(s):num=parse_num(s,i)num_stack.append(num)i+=len(str(num))iflen(s)<=i:breaknext_op=parse_op(s,i)i+=1apply(next_op,num_stack,op_stack)op_stack.append(next_op)apply(Op.NOP,num_stack,op_stack)iflen(num_stack)==1andlen(op_stack)==0:returnnum_stack.pop()else:return0s="2*3+5/6*3+15"print(compute(s))# => 23.5