Python 反向波兰表示法算法不能正确使用相同的操作数

Python 反向波兰表示法算法不能正确使用相同的操作数,python,algorithm,polish-notation,Python,Algorithm,Polish Notation,我写了波兰符号算法。但是,如果运算符之间有相同的操作数,它就不能正常工作。如果我们使用当前列表['a'、'+'、'a'、'*'、'b']运行此代码,它将正常工作,但如果我们更改(a)上的(b),它将无法正常工作。 第一种情况下的结果是(a,a,b,*,+),第二种情况下的结果是(a,a,+,a,*)。为什么会这样 operators = ["+", "-"] operators1 = ["*", "/"] opera

我写了波兰符号算法。但是,如果运算符之间有相同的操作数,它就不能正常工作。如果我们使用当前列表['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']的情况下,该条件将在循环的第一次迭代(第三次、最后一次)时为真。显然,这将产生错误的结果

由于您只想在执行
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)