classSolution{public:intcalculate(strings){intans=0;intnum=0;intsign=1;stack<int>stack{{sign}};// Stack.top(): current env's signfor(constcharc:s)if(isdigit(c))num=num*10+(c-'0');elseif(c=='(')stack.push(sign);elseif(c==')')stack.pop();elseif(c=='+'||c=='-'){ans+=sign*num;sign=(c=='+'?1:-1)*stack.top();num=0;}returnans+sign*num;}};
classSolution{publicintcalculate(Strings){intans=0;intnum=0;intsign=1;Deque<Integer>stack=newArrayDeque<>();// Stack.peek(): current env's signstack.push(sign);for(finalcharc:s.toCharArray())if(Character.isDigit(c))num=num*10+(c-'0');elseif(c=='(')stack.push(sign);elseif(c==')')stack.pop();elseif(c=='+'||c=='-'){ans+=sign*num;sign=(c=='+'?1:-1)*stack.peek();num=0;}returnans+sign*num;}}
classSolution:defcalculate(self,s:str)->int:ans=0num=0sign=1stack=[sign]# stack[-1]: current env's signforcins:ifc.isdigit():num=num*10+(ord(c)-ord('0'))elifc=='(':stack.append(sign)elifc==')':stack.pop()elifc=='+'orc=='-':ans+=sign*numsign=(1ifc=='+'else-1)*stack[-1]num=0returnans+sign*num