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

  • 题目描述
实现一个识别包含加法和乘法算式的程序,输出算式的计算结果,如:
输入 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

posted @ 2020-08-30 16:58  Yelush  阅读(430)  评论(0编辑  收藏  举报