Python中的中缀到前缀转换
Posted
技术标签:
【中文标题】Python中的中缀到前缀转换【英文标题】:Infix to prefix conversion in Python 【发布时间】:2014-09-22 06:16:58 【问题描述】:我想为前缀转换器做一个中缀。当我运行代码时,字符串中的运算符将所有运算符发送到返回字符串的开头。
如何修复下面的代码?
class Stack:
def __init__(self):
self.a = []
def isEmpty(self):
return self.a == []
def push(self,i):
self.a.append(i)
def pop(self):
return self.a.pop()
def peek(self):
return self.a[len(self.a)-1]
def infixToPrefix(s):
prec = '/':3,'*':3,'+':2,'-':2,'^':4,'(':1
opStack = Stack()
prefixList = []
temp = []
for token in s:
if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":
prefixList.append(token)
elif token == '(':
opStack.push(token)
elif token == ')':
topToken = opStack.pop()
while topToken != '(':
temp.append(topToken)
topToken = opStack.pop()
prefixList = temp + prefixList
temp = []
else:
while (not opStack.isEmpty()) and \
(prec[opStack.peek()]>= prec[token]):
temp.append(opStack.pop())
prefixList = temp + prefixList
temp = []
opStack.push(token)
while not opStack.isEmpty():
temp.append(opStack.pop())
prefixList = temp + prefixList
return ''.join(prefixList)
print infixToPrefix("(A+B)*C-(D-E)*(F+G)")
【问题讨论】:
放置您的代码而不是其他站点 您的代码无效。最后一行while...
语法错误。
预期输出是:-*+ABC*-DE+FG
吗?您是否尝试过将一些 print
语句放入您的 Stack
方法和循环中的战略位置,以便您可以了解正在发生的事情?您是否尝试过用铅笔和纸手动运行您的算法,以确保它符合您的预期?
我还应该提到您的数字标记需要修复,除非您只向程序提供单个数字。
在这种情况下我只输入一位数字
【参考方案1】:
不要重新发明***。请改用解析器生成器。例如,PLY (Python lex
-yacc
) 是一个不错的选择。您可以从查看basic example 开始,然后在产生式规则本身内进行转换,或者生成配备了返回前缀、中缀或后缀表示法的扁平化方法的抽象语法树。请注意,这三者之间的区别在于,在语法树的深度优先遍历期间,运算符是在前序、中间还是后序中插入(作为单个函数或递归实现——后者导致更简单和更多的模块化代码)。
【讨论】:
可以找到一个手工制作的解决方案here。【参考方案2】:发布此答案可能为时已晚,但我也将其留作其他人的参考。从中缀转换为后缀时,您似乎已经解决了问题。如果是这种情况,您可以使用相同的算法和代码将您的文本转换为前缀表示法。
您需要做的就是首先反转您的文本,然后将该文本传递给您的算法。反转文本后,您还将将文本存储在已反转的堆栈中。处理完这些后,您需要将文本再次反转为原始形式,您将获得前缀符号。
请务必跟踪您在字典中比较的内容,您将不再将操作数与“(”进行比较。
希望这会有所帮助。
【讨论】:
以上是关于Python中的中缀到前缀转换的主要内容,如果未能解决你的问题,请参考以下文章