Python前缀/中缀/后缀表达式评估

时间:2015-04-03 19:13:56

标签: python class return prefix

关于代码的简短说明: 我必须做一个将评估前缀,后缀或中缀表达式的类。它必须确定它是pre / post / infix并将它们转换为postfix,例如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):

        ...

1 个答案:

答案 0 :(得分:1)

    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)