Python Prefix/Infix/Postfix表达式求值



关于代码的简短介绍:我必须做一个类来计算前缀、后缀或中缀表达式。它必须确定它是否是pre/post/inix,并将它们转换为后缀,例如代码中的prefixTOpostfix()(其他已删除,因为现在不需要)方法从"/x7"转换为"x7/",表达式在方法edit()中从"x7/"编辑为"x 7/"。这两种方法都很好,在多个例子上进行了测试(没有在这里公布整个代码和作业,但也不需要它们。被问到的问题只是我遇到的一个错误,别担心,我不是在问作业的解决方案)。还有assign方法,因为可以有变量,例如"a=3",它可以在表达式中的某个位置。问题:当我运行print(v.evaluate('x 7/'))(后缀中已经存在的内容)时,其中x = 14,它会返回2。然而,当我运行print(v.evaluate('/x 7'))(前缀中的内容)时,它会返回None两个表达式在运行完它们的方法"x 7/"(我在代码中测试了prints)后看起来完全相同,两个堆栈都相同。首先是'14',然后是'14 7',最后是'2'。当我将return(s.pop())更改为return(s.top())时,两个表达式都被精确地评估为'2'。那么,为什么return(s.pop())不能与第二个一起工作呢?如果还有更多关于代码的问题,或者有些地方不够清楚,告诉我我会尝试用不同的方式解释。

class MyClass:
    class Stack:
        ...
    def __init__(self):
        self.table = {}
    def __repr__(self):
        ...
    def assign(self, variable, exp):
        if '+-*/%' in exp: # temporary solution
            exp = self.evaluate(exp)
        self.table[variable] = exp
    def evaluate(self, exp):
        if exp[0] in '+-*/%': # Prefix
            new_exp = self.prefixTOpostfix(exp)
            self.evaluate(new_exp)
        elif exp[len(exp)-1] in '+-*/%': # Postfix
            s = self.Stack()
            exp = self.edit(exp) # from 'x7/' to 'x 7 /'
            for item in exp.split():
                if item == '+':
                    s.push(s.pop() + s.pop())
                ... # other operations
                elif prvok == '/':
                    temp = s.pop()
                    if temp == 0:
                        return None
                    s.push(s.pop() // temp) # it has to be // !
                else: # if it is number / variable
                    if item in self.table:
                        s.push(int(self.table[item]))
                    else:
                        s.push(int(item))
                s.printOUT()
            return(s.pop())
        else: # Infix
            ...

    def prefixTOpostfix(self, exp):
        ...
    def edit(self, exp):
        ...
    if exp[0] in '+-*/%': # Prefix
        new_exp = self.prefixTOpostfix(exp)
        self.evaluate(new_exp)

您需要return递归调用的结果。

    if exp[0] in '+-*/%': # Prefix
        new_exp = self.prefixTOpostfix(exp)
        return self.evaluate(new_exp)

最新更新