Infix以Python格式转换前缀

时间:2014-09-22 06:16:59

标签: 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.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)")

2 个答案:

答案 0 :(得分:0)

不要重新发明轮子。请改用解析器生成器。例如,PLY(Python lex - yacc)是一个不错的选择。您可以从查看basic example开始,然后在生产规则中进行转换,或者生成一个抽象语法树,该树配备有返回前缀,中缀或后缀表示法的展平方法。请注意,这三者之间的区别在于是否在语法树的深度优先遍历期间插入运算符之前,之间或后顺序(以单个函数或递归方式实现 - 后者导致更简单和更模块化的代码)。

答案 1 :(得分:0)

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

您需要做的就是先翻转文本,然后将该文本传递给您的算法。翻转文本后,您还会将文本存储在已倒置的堆栈中。处理完毕后,您需要将文字重新翻转为原始格式,然后才能获得前缀表示法。

请确保在字典中跟踪您的比较,但是您不会将操作数与"("。

进行比较

希望这有帮助。