python - 反向波兰符号算法不能与相同的操作数正确工作
问题描述
我写了波兰符号算法。但是如果操作符之间有相同的操作数,它就不能正常工作。如果我们使用当前列表 ['a', '+', 'a', '*', 'b'] 运行此代码,它将正常工作,但如果我们在 (a) 上更改 (b),它将不会. 第一种情况下的结果是 (a, a, b, *, +),第二种情况下的结果是 (a, a, +, a, *)。为什么会这样?
operators = ["+", "-"]
operators1 = ["*", "/"]
operators2 = ["^"]
operators3 = ["(", ")"]
all_operators = ["+", "-", "*", "/", "^"]
def get_priority(operator):
if operator in operators:
priority = 1
if operator in operators1:
priority = 2
if operator in operators2:
priority = 3
if operator in operators3:
priority = 4
return priority
def notation():
exit = []
stack = []
list = ['a', '+', 'a', '*', 'b']
for i in list:
if i not in all_operators:
exit.append(i)
else:
stack.append(i)
while len(stack) > 1 and get_priority(stack[-2]) >= get_priority(stack[-1]):
exit.append(stack.pop(-2))
if i is list[-1]:
while len(stack) > 0:
exit.append(stack.pop())
print(exit)
notation()
解决方案
i is list[-1]
当列表的最后一个元素是列表中更早出现的值时,错误就会出现。在 ['a', '+', 'a', '*', 'a'] 的情况下,条件将在循环的第一次迭代(以及第三次和最后一次)中为真。显然这会产生错误的结果。
由于您只想在while
循环的最后一次迭代时执行该for
循环,因此您不妨无条件地将该while
循环移到整个块之后。for
我对您的代码应用了一些与您的问题无关的其他更改,并且不是对算法本身的修复,但似乎是更好的做法。我从运算符列表中删除了括号,因为您的代码尚不支持该功能(波兰符号不应包含括号):
operator_priority = {
"+": 1,
"-": 1,
"*": 2,
"/": 2,
"^": 3,
}
all_operators = list(operator_priority.keys())
def notation(tokens):
result = []
stack = []
for token in tokens:
if token not in all_operators:
result.append(token)
else:
prio = operator_priority[token]
while len(stack) > 0 and operator_priority[stack[-1]] >= prio:
result.append(stack.pop())
stack.append(token)
while len(stack) > 0:
result.append(stack.pop())
return result
result = notation(['a', '+', 'a', '*', 'a'])
print(result)
推荐阅读
- java - 如何使用 JAVA 从动态创建的 JSON 中递归获取所有键值对
- c++ - 为什么我无法成功登录?
- java - 在区域设置“en_US”的代码“user.title”下未找到消息
- html - 是否有一个 HTML 标签的内容不能包含 JavaScript?
- ios - UIKit的textColor的iOS13白色问题
- c# - 在 C# 中将 JWT 令牌单一声明属性添加为数组元素
- c# - TPL 数据流反馈回路
- angular - Angular:向表中添加行 - 表单控件没有值访问器
- .net - 在 JSON .NET 中将对象添加到 JSON
- android - 使用自动填充服务 Android 自动填充 chrome