题解 | #表达式求值#
表达式求值
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];