【问题标题】:Python Prefix / Infix / Postfix expression evaluationPython 前缀/中缀/后缀表达式求值
【发布时间】:2015-06-08 21:41:12
【问题描述】:

代码简介: 我必须做一个评估前缀、后缀或中缀表达式的类。它必须确定它是否是前/后/中缀并将它们转换为后缀,例如代码中的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):

        ...

【问题讨论】:

    标签: python class return prefix


    【解决方案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)
    

    【讨论】:

    • 天哪,你是对的!直到现在我才意识到。多么愚蠢的错误。如果我可以问,我理解(或至少半理解),为什么 pop() 不起作用,但为什么 top() 起作用?
    • 啊,我不能那样做,但还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2017-05-02
    • 2013-04-03
    相关资源
    最近更新 更多