题解 | #表达式求值#

表达式求值

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

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 返回表达式的值
# @param s string字符串 待计算的表达式
# @return int整型
恶心的地方在于必须用状态机来注意乘法优先级,1*2这种直接算完压栈,其次就是左括号压栈,右括号弹栈计算并压栈直到弹出左括号;最后如果数字栈中仍然有超过2个数,这肯定就是没有括号和乘法的加减法,按队列先进先出弹压栈处理就好
#
class Solution:
    def solve(self , s: str) -> int:
        # write code here
        nums=[];
        opes=[];
        sym=['+','-','*','/'];
        temp='';
        f=0;
        for i in range(len(s)):
            if s[i] in sym:
                opes.append(s[i]);
                if s[i]=='*' and f==1:f=2;
                else:f=0;
            elif ord(s[i])>=ord('0') and ord(s[i])<=ord('9'):
                if f==0:f=1;
                if f==2:f=3;
                temp+=s[i];
                if i+1<len(s):
                    if ord(s[i+1])>=ord('0') and ord(s[i+1])<=ord('9'):continue;
                    else:nums.append(int(temp));temp='';
                else:nums.append(int(temp));temp='';
                if f==3:opes.pop();nums.append(nums.pop()*nums.pop());f=0;
            else:
                if s[i]==')':
                    while opes[-1]!='(':
                      n2=nums.pop();n1=nums.pop();ope=opes.pop();
                      if ope=='+':nums.append(n1+n2);
                      elif ope=='*':nums.append(n1*n2);
                      else:nums.append(n1-n2);
                    opes.pop();
                else:opes.append(s[i]);f=0;
            print(nums,opes,f)           
        if len(nums)==2:
            n2=nums.pop();n1=nums.pop();ope=opes.pop();
            if ope=='+':nums.append(n1+n2);
            elif ope=='*':nums.append(n1*n2);
            else:nums.append(n1-n2);
        else:
            while len(opes)>0:
                n1=nums.pop(0);n2=nums.pop(0);ope=opes.pop();
                if ope=='+':nums.insert(0,n1+n2);
                else:nums.insert(0,n1-n2);

        return nums[0];

全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
04-08 00:50
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务