Python中的中缀到前缀转换

Python中的中缀到前缀转换,python,prefix,infix-notation,Python,Prefix,Infix Notation,我想做一个中缀到前缀的转换器。当我运行代码时,字符串中的运算符发送返回字符串开头的所有运算符 如何修复下面的代码 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

我想做一个中缀到前缀的转换器。当我运行代码时,字符串中的运算符发送返回字符串开头的所有运算符

如何修复下面的代码

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)")

不要重新发明轮子。改用解析器生成器。例如,(Python
lex
-
yacc
)是一个很好的选择。您可以从查看开始,或者在产生式规则本身中进行转换,或者生成一个抽象语法树,该树配备了返回前缀、中缀或后缀符号的扁平化方法。请注意,这三者之间的区别在于,在语法树的深度优先遍历过程中,运算符是按前置、中间还是后置顺序插入的(可以作为单个函数实现,也可以递归实现,后者会导致更简单、更模块化的代码)。

发布此答案可能已经晚了,但我也将此作为其他人的参考。看起来,你已经解决了从中缀到后缀的转换问题。如果是这样,您可以使用相同的算法和代码将文本转换为前缀符号

您所需要做的就是先反转文本,然后通过算法传递文本。反转文本后,还可以将文本存储在已反转的堆栈中。处理完后,您需要将文本再次反转为原始形式,然后您将获得前缀符号

不过,请确保跟踪您在字典中比较的内容,您将不再将操作数和“(”进行比较


希望这能有所帮助。

将您的代码放在其他位置而不是其他位置您的代码无效。while…的最后一行
语法不正确。预期的输出是:
-*+ABC*-DE+FG
?您是否尝试过通过循环将一些
打印
语句放入
堆栈
方法和策略位置,以便您可以执行以下操作发生了什么事?你有没有试过用铅笔和纸手工运行你的算法,以确保它达到你期望的效果?我还应该提到,你的数字标记化需要修复,除非你只向程序输入一位数。在这种情况下,我只输入一位数。一个手工制作的解决方案可以是建立