递归:
def oper_two(num_one, oper, num_two): if oper == '+': return str(int(num_one) + int(num_two)) if oper == '-': return str(int(num_one) - int(num_two)) if oper == '*': return str(int(num_one) * int(num_two)) if oper == '/': if num_two != '0': return str(int(num_one) / int(num_two)) print 'oper_two error!' #a = oper_two('4', '/', '2') #print a def compute_str(mystr): print "str is: " , mystr if len(mystr) < 4: return oper_two(mystr[0], mystr[1], mystr[2]) if mystr[1] == '*' or mystr[1] == '/': return compute_str(compute_str(mystr[0:3]) + mystr[3:]) elif mystr[3] == '*' or mystr[3] == '/': return compute_str(mystr[0:2] + compute_str(mystr[2:5]) + mystr[5:]) else: return compute_str(compute_str(mystr[:3]) + mystr[3:]) def compute_allstr(allstr): print "allstr is:" , allstr first = allstr.find('(') last = allstr.rfind(')') # print first , 'and', last if first != -1 and last != -1: return compute_allstr(allstr[:first] + compute_str(allstr[first+1:last]) + allstr[last+1:]) else: return compute_str(allstr) #arith_str = "1+2*3-7/2" #result = compute_str(arith_str) arith_str = "1+2*(7-3)/2" result = compute_allstr(arith_str) print result
输出:
allstr is: 1+2*(7-3)/2
str is: 7-3
allstr is: 1+2*4/2
str is: 1+2*4/2
str is: 2*4
str is: 1+8/2
str is: 8/2
str is: 1+4
5
def oper_two(num_one, oper, num_two): if oper == '+': return str(int(num_one) + int(num_two)) if oper == '-': return str(int(num_one) - int(num_two)) if oper == '*': return str(int(num_one) * int(num_two)) if oper == '/': if num_two != '0': return str(int(num_one) / int(num_two)) print 'oper_two error!' #a = oper_two('4', '/', '2') #print a def compute_str(mystr): print "str is: " , mystr tmp_list = [] if len(mystr) < 4: return oper_two(mystr[0], mystr[1], mystr[2]) if mystr[1] == '*' or mystr[1] == '/': for i in mystr[0:3]: tmp_list.append(i) for i in mystr[3:]: tmp_list.append(i) return compute_str(tmp_list) elif mystr[3] == '*' or mystr[3] == '/': for i in mystr[0:2]: tmp_list.append(i) tmp_list.append(compute_str(mystr[2:5])) for i in mystr[5:]: tmp_list.append(i) return compute_str(tmp_list) else: tmp_list.append(compute_str(mystr[:3])) for i in mystr[3:]: tmp_list.append(i) return compute_str(tmp_list) def compute_allstr(allstr): print "allstr is:" , allstr tmp_list = [] count = 0 first = -1 last = -1 for i in allstr[:]: count += 1 if i == '(': first = count count = 0 for i in allstr[-1::-1]: count += 1 if i == ')': last = count print first , 'and', last if first != -1 and last != -1: for i in allstr[:first-1]: tmp_list.append(i) tmp_list.append(compute_str(allstr[first:-last])) for i in allstr[-last+1:]: tmp_list.append(i) return compute_allstr(tmp_list) else: return compute_str(allstr) #arith_str = "1+2*3-7/2" #result = compute_str(arith_str) #arith_str = "1+2*(7-3)/2" #result = compute_allstr(arith_str) def str2list(mystr): mylist = [] one_num = 0 tmp_i = '' for i in mystr: if i.isdigit(): one_num = one_num * 10 + int(i) elif i == '(': mylist.append(i) elif i == ')': mylist.append(one_num) one_num = 0 mylist.append(i) else: if tmp_i != ')': mylist.append(one_num) one_num = 0 mylist.append(i) tmp_i = i mylist.append(one_num) return mylist # #arith_str = "1+2*17-3/2" arith_str = "1+2*(17-3)/2" arith_list = str2list(arith_str) print arith_list result = compute_allstr(arith_list) print result
输出:
[1, '+', 2, '*', '(', 17, '-', 3, ')', '/', 2]
allstr is: [1, '+', 2, '*', '(', 17, '-', 3, ')', '/', 2]
5 and 3
str is: [17, '-', 3]
allstr is: [1, '+', 2, '*', '14', '/', 2]
-1 and -1
str is: [1, '+', 2, '*', '14', '/', 2]
str is: [2, '*', '14']
str is: [1, '+', '28', '/', 2]
str is: ['28', '/', 2]
str is: [1, '+', '14']
15
使用栈: