Python 反向波兰表示法算法不能正确使用相同的操作数
我写了波兰符号算法。但是,如果运算符之间有相同的操作数,它就不能正常工作。如果我们使用当前列表['a'、'+'、'a'、'*'、'b']运行此代码,它将正常工作,但如果我们更改(a)上的(b),它将无法正常工作。 第一种情况下的结果是(a,a,b,*,+),第二种情况下的结果是(a,a,+,a,*)。为什么会这样Python 反向波兰表示法算法不能正确使用相同的操作数,python,algorithm,polish-notation,Python,Algorithm,Polish Notation,我写了波兰符号算法。但是,如果运算符之间有相同的操作数,它就不能正常工作。如果我们使用当前列表['a'、'+'、'a'、'*'、'b']运行此代码,它将正常工作,但如果我们更改(a)上的(b),它将无法正常工作。 第一种情况下的结果是(a,a,b,*,+),第二种情况下的结果是(a,a,+,a,*)。为什么会这样 operators = ["+", "-"] operators1 = ["*", "/"] opera
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']的情况下,该条件将在循环的第一次迭代(第三次、最后一次)时为真。显然,这将产生错误的结果
由于您只想在执行for
循环的最后一次迭代时执行while
循环,因此您最好将while
循环无条件地移动到整个for
块之后
我对您的代码进行了一些其他更改,这些更改与您的问题无关,也不是对算法本身的修复,只是看起来更好。我从操作符列表中删除了括号,因为您的代码还不支持该功能(波兰语符号不应包括括号):
“在(a)上更改(b)”是什么意思?当您使用调试器运行程序时,它所做的第一件事是什么,这是您没有预料到的?欢迎使用。请注意,所示代码的格式不正确–至少有两个缩进不正确的块。请回答您的问题,使我们能够调试您的实际代码。请参阅和页面如何最好地帮助我们帮助您。如果我是列表[-1]:用于什么?请注意,您的问题可能是由于
如果我是列表[-1]:
行引起的。仅当最后一个元素与其他元素相同时才会触发此操作,即list[0]是list[-1]
,而list[2]是list[-1]
,因此在a'、“+”、“*”、“a'、“*”、“a']”中才会触发此操作。这一行可能不符合您的要求–是
是标识运算符,文字值的标识由实现定义。您的意思是测试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)