题解 | #四则运算#
四则运算
http://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
Python3 逆波兰方法求解四则运算
a = input() for ch in a: if ch in '[{': a = a.replace(ch,'(') elif ch in '}]': a = a.replace(ch,')') b = [' '] # 存储四则运算符号(栈) c = [] # 存储输出的后缀表达式 d = {'*': 3, '/': 3, '+': 2, '-': 2, ' ': 1} # 字典存储优先级 flag = 0 for i in range(len(a)): if a[i] == '-': if i == 0: # 如果'-'为负号,跳出该次循环,flag = 1 flag = 1 continue elif a[i-1] in '(': flag = 1 continue elif 48 <= ord(a[i]) <= 57: #如果上一个字符也是数字,直接跳出此次循环 if i == 0: pass elif 48 <= ord(a[i-1]) <= 57: continue if 48 <= ord(a[i]) <= 57: # 数字直接输出 num = a[i] if i != len(a)-1: j = 1 while i+j < len(a): if 48 <= ord(a[i + j]) <= 57: num += a[i+j] j = j+1 break if flag == 1: c.append('-' + num) flag = 0 else: c.append(num) elif a[i] == ')': # 右括号,栈顶元素出栈输出,直到遇到左括号或栈空为止 while b[-1] != ' ' and b[-1] != '(': c.append(b.pop()) if b[-1] == '(': b.pop() elif a[i] == '(' or b[-1] == '(': # 符号为'('或栈顶为'(',则直接入栈 b.append(a[i]) elif d[a[i]] > d[b[-1]]: # 优先级高,直接入栈 b.append(a[i]) else: # 优先级比栈顶元素低,则出栈,直到比栈顶元素优先级高或栈空 while d[a[i]] <= d[b[-1]] and b[-1] != ' ': c.append(b.pop()) if b[-1] == '(': break b.append(a[i]) if len(b) > 1: for i in range(1,len(b)): c.append(b.pop()) b = [] # 存放数字 for ch in c: if len(ch) > 1: b.append(eval(ch)) elif 48 <= ord(ch) <= 57: #如果是数字,进栈 b.append(eval(ch)) else: x1 = b.pop() x2 = b.pop() if ch == '+': m = x2 + x1 elif ch == '-': m = x2 - x1 elif ch == '*': m = x2 * x1 else: m = x2 /x1 b.append(m) print(b[0])