现在,这是我的代码:
precedence = {
"+": 1,
"-": 1,
"*": 2,
"/": 2,
"": 0
}
def is_operator(token):
ope = set(['+', '-', '*', '/'])
return token in ope
def prefix_to_infix(expression):
stack = []
for pos, i in enumerate(expression):
if is_operator(i):
value1 = stack.pop()
value2 = stack.pop()
result = f"{value1}{i}{value2}"
next_ope = check_next_operator(pos, expression)
# Adds parenthesis if needed
if compare_precedence(i, next_ope):
result = f"{result}"
stack.append(result)
else:
stack.append(str(i))
return result
def check_next_operator(pos, expression):
i = pos + 1
while i < len(expression):
if is_operator(expression[i]):
return expression[i]
i += 1
return ""
def compare_precedence(actual, next):
if precedence[actual] <= precedence[next] and precedence[next] != 0:
return True
else:
return False
但是,当我try 打印插入值+ / - 9 4 * 5 - 7 3 6
时,(5 * (7 - 3))
之间的圆括号丢失了.当然,这是因为-
的优先级低于*
.
此外,在- + - - - + 7 8 * / 5 4 2 6 * 7 2 3 0
这样的情况下,它返回的括号比应有的多.
NOTE:我传递的表达式已经是反向的,这意味着它已经被转换为其后缀形式:['6', '3', '7', '-', '5', '*', '4', '9', '-', '/', '+']
我正在考虑一种方法,但我不确定它是否会奏效:
- 如果下一个运算符的优先级更高:添加圆括号
- 如果下一个运算符具有相同的优先级:如果它是不同的运算符,或者如果这个运算符不是可交换的,则只添加圆括号.
- 如果下一个运算符的优先级较低:判断此表达式是否还有剩余的运算.如果有相同运算符的运算,则只在此运算符不同的情况下添加括号;如果是不同的运算符,则添加括号;如果此表达式没有剩余的运算,则不要添加括号.