思路
使用双栈,一个操作数栈,一个运算符栈。
可以先了解下“逆波兰表达式求值”问题,再理解这题可能会容易一些。
python向0取整问题
python 的整数除法是向下取整,而不是向零取整.
例如:-1 / 2 = -1 而不是等于0
解决方法为:int(number1/float(number2))
int()方法将只保留整数位
参考代码:
tokens = input()
stack = [] # 存储数字
opt = [] # 存储操作方式
def calculate():
res = 0 # 计算结果
b, a = stack.pop(), stack.pop()
p = opt.pop()
if p == "+":
res = a + b
elif p == "-":
res = a - b
elif p == "*":
res = a * b
elif p == "/":
res = int(a /float(b))
stack.append(res)
i = 0
while i < len(tokens):
if tokens[i].isdigit(): # 如果是数字则直接存入
val = 0
j = i
while j < len(tokens) and tokens[j].isdigit():
val = val * 10 + int(tokens[j])
j += 1
stack.append(val)
i = j -1 # 指向数字最后一位
elif tokens[i] == "(": # 左括号存入opt,后面用以限制计算范围
opt.append(tokens[i])
elif tokens[i] == ")": # 出现右括号就可以计算与最近的左括号之间的操作
while opt[-1] != "(":
calculate()
opt.pop() # 删除已经计算的左括号
else: # 运算符
while tokens[i] in ["-", "+"] and len(opt) and opt[-1] in ["*", "/"]: # 先乘除后加减
calculate()
while tokens[i] in ["*", "/"] and len(opt) and opt[-1] in ["*", "/"]:
# 若优先级相同,从前面开始向后计算,避免出现不合法操作。这里不知道能怎么去简化
calculate()
while tokens[i] in ["-", "+"] and len(opt) and opt[-1] in ["-", "+"]:
calculate()
opt.append(tokens[i])
i+=1 # 后移,指向下一个字符
while len(stack)>1: # 计算剩下的操作
calculate()
print(stack[0])