• 腾讯面试题:中缀表达式求值(两个栈)


    • 题目描述
    实现一个识别包含加法和乘法算式的程序,输出算式的计算结果,如:
    输入 1+1+2*2,输出6
    输入 (1+1)*2+1,输出5
    • 求解:用两个栈

    两个栈,一个用于保存操作符,一个用于保存数字。(也可以先用一个栈将中缀表达式转化成后缀表达式,再用一个栈计算后缀表达式的值)

    '''
    用两个栈计算中缀表达式的值
    '''
    def cal(operator, op1, op2):
        if operator == '+':
            return op1 + op2
        elif operator == '-':
            return op1 - op2
        elif operator == '*':
            return op1 * op2
        elif operator == '/':
            return op1 / op2
    
    def exprCal(alist):
        pre = {'*': 3, '/': 3, '+': 2, '-': 2, '(': 1}
        number_stack = []
        operate_stack = []
        for token in alist:
            if token.isdecimal() or token[1:].isdecimal():
                number_stack.append(int(token))
            elif token == '(':
                operate_stack.append(token)
            elif token == ')':
                while operate_stack[-1] != '(':
                    op1 = number_stack.pop()
                    op2 = number_stack.pop()
                    res = cal(operate_stack.pop(), op2, op1)
                    number_stack.append(res)
                operate_stack.pop()
            elif token in '*/+-':
                while operate_stack and pre[token] <= pre[operate_stack[-1]]:
                    op1 = number_stack.pop()
                    op2 = number_stack.pop()
                    res = cal(operate_stack.pop(), op2, op1)
                    number_stack.append(res)
                operate_stack.append(token)
        while operate_stack:
            op1 = number_stack.pop()
            op2 = number_stack.pop()
            number_stack.append(cal(operate_stack.pop(), op2, op1))
        return number_stack[0]
    if __name__ == "__main__":
        s = '1+2*3/(4+5)'
        alist = list(s)
        print(exprCal(alist))

    参考链接:https://www.yuque.com/docs/share/3bd692c8-4727-4f30-9f43-14c00f0c1894

  • 相关阅读:
    Tomcat 启动很慢?
    CentOS 下 安装 JDK8
    CentOS 下 安装 nginx
    SpringBoot 之 打war包
    Spring MVC处理异常有3种方法
    springboot 之 使用jetty web容器
    IDEA 中,编译后不拷贝 mybatis 配置的 mapper 的 xml 文件
    js 鼠标点击页面出现文字
    PHP 获取天气
    js 必须为字母或下划线, 一旦创建不能修改
  • 原文地址:https://www.cnblogs.com/yeshengCqupt/p/13585747.html
Copyright © 2020-2023  润新知