当前位置: 首页 > 知识库问答 >
问题:

Python前缀/Infix/Postfix表达式计算

司空皓
2023-03-14

代码简介:我必须创建一个类来计算前缀、后缀或中缀表达式。它必须确定它是否是pre/post/infix,并将它们转换为后缀,例如,在从“/x7”转换为“x7/”的代码中,表达式在方法edit()中从“x7/”编辑为“x7/”。这两种方法都很好,在多个示例上进行了测试(没有在这里发布完整的html" target="_blank">代码和作业,但也不需要它们。所问的问题只是我遇到的一个错误,不要担心,我不是在要求解决我的作业)。还有assign方法,因为可以有变量,例如'a=3',它可以在表达式中的某个地方。问题:当我运行print(v.evaluate('x7/'))(后缀中已经存在的内容),其中x=14,它会返回它应该返回的2。但是,当我运行print(v.evaluate('/x7'))(前缀中的内容)时,它返回None。这两个表达式在运行其方法“x7/”后看起来完全相同(我在代码中测试了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个答案

蔡鹏程
2023-03-14
    if exp[0] in '+-*/%': # Prefix
        new_exp = self.prefixTOpostfix(exp)
        self.evaluate(new_exp)

您需要返回递归调用的结果。

    if exp[0] in '+-*/%': # Prefix
        new_exp = self.prefixTOpostfix(exp)
        return self.evaluate(new_exp)
 类似资料:
  • 问题描述 (Problem Description) 如何将中缀表达式转换为后缀表达式? 解决方案 (Solution) 下面的示例演示如何使用stack的概念将中缀转换为后缀表达式。 import java.io.IOException; public class InToPost { private Stack theStack; private String input;

  • 这是一个理论上的问题: 我必须计算一个表达式,我已经从中缀转换到后缀。后缀保存在中,因为我希望避免使用。这样我就知道数字之间的除法在哪里,我可以按“正确”的顺序访问它。 它看起来是这样的: 现在我想用两个堆栈: null 如果我到达一个运算符,并且数量计数至少为2,我将执行该操作并将其推到目标堆栈上。到达原始堆栈的末尾(现在是空的),我会把所有的东西都传递给它,然后从头开始,直到只剩下结果。 我现

  • 当你编写一个算术表达式如 B*C 时,表达式的形式使你能够正确理解它。在这种情况下,你知道 B 乘以 C, 因为乘法运算符 * 出现在表达式中。这种类型的符号称为中缀,因为运算符在它处理的两个操作数之间。看另外一个中缀示例,A+B*C,运算符 + 和 * 仍然出现在操作数之间。这里面有个问题是,他们分别作用于哪个运算数上,+ 作用于 A 和 B , 还是 * 作用于 B 和 C?表达式似乎有点模糊

  • 本文向大家介绍中缀表达式转后缀表达式相关面试题,主要包含被问及中缀表达式转后缀表达式时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 对于中缀表达式,遇到操作数直接将其输出,如果遇到操作符和左括号全部压入栈中,若遇到右括号则将栈中元素全部弹出,直到遇到左括号为止。压栈过程中,若遇到其它操作符,从栈中弹出元素直到遇到更低优先级的操作符为止。

  • 本文向大家介绍将中缀转换为前缀表达式,包括了将中缀转换为前缀表达式的使用技巧和注意事项,需要的朋友参考一下 要通过计算机求解表达式,我们可以将其转换为后缀形式或前缀形式。在这里,我们将看到中缀表达式如何转换为前缀形式。 首先,中缀表达式反转。注意,对于反转,圆括号也将反转。 例如:表达式:A + B *(C-D) 反转后的表达式为:)D – C(* B + A 因此我们需要将左括号转换为右括号,反

  • 我需要的算法,将检查是否给定的表达式是中缀,后缀或前缀表达式。我尝试了一种方法,通过检查字符串的第一个或最后两个项,例如。 AB如果字符串的第一个索引中有一个运算符,那么它就是一个前缀 AB如果字符串的最后一个索引中有一个运算符,那么它就是一个后缀 否则它就是一个中缀。 但是感觉不太合适,所以请建议我一个更好的算法。