加减法优先-计算表达式Python实现


思路:首先把字符串用“*”和“/”分割开来,然后,对没有乘除号的调用正常的计算函数(这个函数LeetCode有实现方法,乘除号优先,用栈实现),然后再把现在只有乘除号的式子再调用一次正常的计算函数。

总体思路就是,基于乘除号优先的函数,我们每次优先调用只有加减号的表达子式。


例如:”1+2*3”的表达式,先后变成这样两个list,然后调用乘除号优先函数,得出结果。
[‘1+2’, ‘*’, ‘3’]
[3, ‘*’, ‘3’]
9



def calculate_ori( s):
    if not s:
        return "0"
    stack, num, sign = [], 0, "+"
    for i in range(len(s)):
        if s[i].isdigit():
            num = num*10+ord(s[i])-ord("0")
            # print(num)
        if (not s[i].isdigit() and not s[i].isspace()) or i == len(s)-1:
            if sign == "-":
                stack.append(-num)
                # print(stack)
            elif sign == "+":
                stack.append(num)
                # print(stack)
            elif sign == "*":
                stack.append(stack.pop()*num)
                # print(stack)
            else:
                tmp = stack.pop()
                stack.append(tmp//num)
            sign = s[i]
            num = 0
            # print(sign)

    return sum(stack)

mini = []
start = 0
def calculate( s,start):
    if not s:
        return "0"
    for i in s:
        if i =='*' or i =='/':
            mini.append(s[start:s.index(i)])
            mini.append(i)
            start = s.index(i)+1
    mini.append(s[start:])
    # print(mini)
    for i in mini:
        if '-'in i or '+' in i:
            mini[mini.index(i)]=calculate_ori(i)
    # print(mini)
    strr = ''.join([str(i) for i in mini])
    return calculate_ori(strr)

print(calculate('1+2*3',0))

猜你喜欢

转载自blog.csdn.net/listep/article/details/82423555