题解 | #四则运算#
四则运算
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])
