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中的中缀到前缀转换的主要内容,如果未能解决你的问题,请参考以下文章

中缀到前缀的程序中的c函数中未返回反转字符串

如何在程序中将中缀表达式转换为后缀表达式

python数据结构 栈的实例 表达式转换 中缀转前缀后缀

逻辑条件的 C++ 中缀到前缀转换

中缀前缀后缀表达式的转换

在 Python 中为中缀表示法添加前缀表示法