Python实现中缀表达式求值

一、思路

有些类似于先把中缀表达式转化为后缀表达式,然后再对后缀表达式求值。但是因为我们最终只需要求出来的值,不想得到后缀表达式,所以就一边遍历一边计算了。关键点在于,我们借助两个栈,一个栈存放操作数,一个栈存放运算符。每次计算都是从运算符栈弹出一个运算符,从操作数栈弹出两个操作数,计算后的结果压回操作数栈。

二、代码实现

def infix_evaluator(infix_expression : str) -> int :
    '''这是中缀表达式求值的函数
    :参数 infix_expression:中缀表达式
    '''
    token_list = infix_expression.split()
    print(token_list)
    # 运算符优先级字典
    pre_dict = {'*':3,'/':3,'+':2,'-':2,'(':1}
    # 运算符栈
    operator_stack = []
    # 操作数栈
    operand_stack = []
    for token in token_list:
        # 数字进操作数栈
        if token.isdecimal() or token[1:].isdecimal():
            operand_stack.append(int(token))
        # 左括号进运算符栈
        elif token == '(':
            operator_stack.append(token)
        # 碰到右括号,就要把栈顶的左括号上面的运算符都弹出求值
        elif token == ')':
            top = operator_stack.pop()
            while top != '(':
                # 每弹出一个运算符,就要弹出两个操作数来求值
                # 注意弹出操作数的顺序是反着的,先弹出的数是op2
                op2 = operand_stack.pop()
                op1 = operand_stack.pop()
                # 求出的值要压回操作数栈
                # 这里用到的函数get_value在下面有定义
                operand_stack.append(get_value(top,op1,op2))
                # 弹出下一个栈顶运算符
                top = operator_stack.pop()
        # 碰到运算符,就要把栈顶优先级不低于它的都弹出求值
        elif token in '+-*/':
            while operator_stack and pre_dict[operator_stack[-1]] >= pre_dict[token]:
                top = operator_stack.pop()
                op2 = operand_stack.pop()
                op1 = operand_stack.pop()
                operand_stack.append(get_value(top,op1,op2))
            # 别忘了最后让当前运算符进栈
            operator_stack.append(token)
    # 表达式遍历完成后,栈里剩下的操作符也都要求值   
    while operator_stack:
        top = operator_stack.pop()
        op2 = operand_stack.pop()
        op1 = operand_stack.pop()
        operand_stack.append(get_value(top,op1,op2))
    # 最后栈里只剩下一个数字,这个数字就是整个表达式最终的结果
    return operand_stack[0]

def get_value(operator : str, op1 : int, op2 : int):
    '''这是四则运算函数
    :参数 operator:运算符
    :参数 op1:左边的操作数
    :参数 op2:右边的操作数
    '''
    if operator == '+':
        return op1 + op2
    elif operator == '-':
        return op1 - op2
    elif operator == '*':
        return op1 * op2
    elif operator == '/':
        return op1 / op2

# 用一个例子试试,得出了结果  -10
print(infix_evaluator('-5 * 1 - ( 2 + 3 )'))

 

如果这篇博文帮到了你,就请给我点个吧(#^.^#)

有疑问也欢迎留言~博主可nice啦,在线秒回ヾ(◍°∇°◍)ノ゙

  • 29
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以通过以下步骤使用 Python 实现中缀表达式求值: 1. 定义一个函数 `infix_eval(expr)`,其中 `expr` 是中缀表达式的字符串形式。 2. 创建两个空,一个用于存储操作数,一个用于存储操作符。 3. 定义一个函数 `priority(op)`,用于返回操作符的优先级。例如,`priority('+')` 返回 1,`priority('*')` 返回 2。 4. 遍历中缀表达式的每个字符,如果是数字则将其作为操作数入,如果是操作符则将其与操作符顶元素比较优先级,如果优先级较高则入,否则将操作符中的操作符弹出并计算,直到当前操作符可以入。 5. 当遍历完中缀表达式后,将操作符中的所有操作符依次弹出并计算。 下面是 Python 代码实现: ```python def infix_eval(expr): operands = [] operators = [] i = 0 while i < len(expr): if expr[i].isdigit(): num = "" while i < len(expr) and expr[i].isdigit(): num += expr[i] i += 1 operands.append(int(num)) elif expr[i] in "+-*/": while operators and priority(operators[-1]) >= priority(expr[i]): op = operators.pop() b = operands.pop() a = operands.pop() operands.append(eval_expr(a, b, op)) operators.append(expr[i]) i += 1 else: i += 1 while operators: op = operators.pop() b = operands.pop() a = operands.pop() operands.append(eval_expr(a, b, op)) return operands[0] def priority(op): if op in "+-": return 1 elif op in "*/": return 2 else: return 0 def eval_expr(a, b, op): if op == "+": return a + b elif op == "-": return a - b elif op == "*": return a * b elif op == "/": return a / b # 测试 print(infix_eval('1+2*3')) # 输出 7 print(infix_eval('(1+2)*3')) # 输出 9 ``` 注意,上述代码只适用于整数运算,如果要支持小数运算,可以将 `int(num)` 改为 `float(num)`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值