题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 返回表达式的值
# @param s string字符串 待计算的表达式
# @return int整型
#
import re

class Solution:
    def cal(self,signs,nums):
        # 注意该运算为倒序运算,需要进行符号转换
        s=signs.pop(-1)
        num2=nums.pop(-1)
        num1=nums.pop(-1)
        if s=="+":
            nums.append(int(num1+num2))
        elif s=="-":
            if signs and signs[-1]=="-":
                nums.append(int(num1+num2))
            else:
                nums.append(int(num1-num2))
        elif s=="*":
            if signs and signs[-1]=="/":
                nums.append(int(num1*(1/num2)))
            else:
                nums.append(int(num1*num2))
        elif s=="/":
            nums.append(int(num1/num2))


    def solve(self , s: str) -> int:
        # write code here
        pattern=r'([-+*/()])|(\d+)'
        tokens=re.findall(pattern,s)
        tokens = [token for token in sum(tokens, ()) if token.strip() != '']
        nums=[]
        signs=[]

        for i in tokens:
            if i.isdigit():
                nums.append(int(i))

            elif signs and i in "+-" and signs[-1] in "*/":
                # 遇到高等级的运算,先计算高等级运算,直到遇到左括号
                while signs and signs[-1]!="(":
                    self.cal(signs,nums)
                signs.append(i)
                
            elif i==")":
                # 计算结果直到遇到左括号,弹出左括号后停止
                while signs[-1]!="(":
                    self.cal(signs,nums)
                signs.pop(-1)
            else:
                signs.append(i)
        # 此循环结束后括号全部被消除,得到无括号的表达式


        while signs:
            self.cal(signs,nums)

        return nums[-1]

全部评论

相关推荐

12-15 12:50
河北工程大学
sta666:我也是这个国际商业化的,三天,一天一面,就通过了,不过我是后端实习生,好好面感觉能过。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务