Python 中缀表达式转后缀表达式 (计算器)

0 投票
1 回答
1823 浏览
提问于 2025-04-18 02:27

我有一个作业要做一个计算器(把中缀表达式转换成后缀表达式)。我运行这段代码时出现了语法错误(无效的语法 if expr*:*),请问我该怎么修复这个错误呢?

顺便说一下,我是个新手程序员,这个问题对专家来说可能很简单。如果你能尽快给我答案,我会非常感激。

class Op:
def __init__(self, num_in, num_out, fn):
    """
    A postfix operator

    num_in:     int
    num_out:    int
    fn:         accept num_in positional arguments,
                perform operation,
                return list containing num_out values
    """
    assert num_in  >= 0, "Operator cannot have negative number of arguments"
    self.num_in = num_in
    assert num_out >= 0, "Operator cannot return negative number of results"
    self.num_out = num_out
    self.fn = fn

def __call__(self, stack):
    """
    Run operator against stack (in-place)
    """
    args = stack.pop_n(self.num_in)         # pop num_in arguments
    res = self.fn(*args)                    # pass to function, get results
    stack.push_n(self.num_out, res)         # push num_out values back
ops = {
'*':  Op(2, 1, lambda a,b: [a*b]),          # multiplication
'/':  Op(2, 1, lambda a,b: [a//b]),         # integer division
'+':  Op(2, 1, lambda a,b: [a+b]),          # addition
'-':  Op(2, 1, lambda a,b: [a-b]),          # subtraction
'/%': Op(2, 2, lambda a,b: [a//b, a%b])     # divmod (example of 2-output op)

}

def postfix_eval(tokens):
"""
Evaluate a series of tokens as a postfix expression;
return the resulting stack
"""
if is_str(tokens):
    # if tokens is a string, treat it as a space-separated list of tokens
    tokens = tokens.split()

stack = Stack()
for token in tokens:
    try:
        # Convert to int and push on stack
        stack.append(int(token))
    except ValueError:
        try:
            # Not an int - must be an operator
            # Get the appropriate operator and run it against the stack
            op = ops[token]
            op(stack)         # runs Op.__call__(op, stack)
        except KeyError:
            # Not a valid operator either
            raise ValueError("unknown operator {}".format(token))
return stack

def main():
while True:
    expr = input(eval('\nEnter a postfix expression (or nothing to quit): ').strip()
    if expr:
        try:
            print("  => {}".format(postfix_eval(expr)))
        except ValueError as error:
            print("Your expression caused an error: {}".format(error))
    else:
        break

if __name__=="__main__":
main()

1 个回答

0

可以看看这个链接:http://www.daniweb.com/software-development/python/threads/12326/how-to-do-input-in-python。如果你在你的主函数里试试下面的代码:

raw_input("Enter a postfix expression (or nothing to quit): ")

这样应该会更好用。

祝好,
彼得

撰写回答