classSolution{public:intcalculate(strings){stack<int>nums;stack<int>ops;boolhasPrevNum=false;autocalc=[&](){constintb=nums.top();nums.pop();constinta=nums.top();nums.pop();constcharop=ops.top();ops.pop();if(op=='+')nums.push(a+b);elseif(op=='-')nums.push(a-b);elseif(op=='*')nums.push(a*b);else// Op == '/'nums.push(a/b);};for(inti=0;i<s.length();++i){constcharc=s[i];if(isdigit(c)){intnum=c-'0';while(i+1<s.length()&&isdigit(s[i+1]))num=num*10+(s[i+++1]-'0');nums.push(num);hasPrevNum=true;}elseif(c=='('){ops.push('(');hasPrevNum=false;}elseif(c==')'){while(ops.top()!='(')calc();ops.pop();// Pop '('}elseif(c=='+'||c=='-'||c=='*'||c=='/'){if(!hasPrevNum)nums.push(0);while(!ops.empty()&&precedes(ops.top(),c))calc();ops.push(c);}}while(!ops.empty())calc();returnnums.top();}private:// Returns true if prevOp is a operator and// Priority(prevOp) >= priority(currOp)boolprecedes(charprevOp,charcurrOp){if(prevOp=='(')returnfalse;returnprevOp=='*'||prevOp=='/'||currOp=='+'||currOp=='-';}};
classSolution{publicintcalculate(Strings){Deque<Integer>nums=newArrayDeque<>();Deque<Character>ops=newArrayDeque<>();booleanhasPrevNum=false;for(inti=0;i<s.length();++i){finalcharc=s.charAt(i);if(Character.isDigit(c)){intnum=c-'0';while(i+1<s.length()&&Character.isDigit(s.charAt(i+1)))num=num*10+(s.charAt(i+++1)-'0');nums.push(num);hasPrevNum=true;}elseif(c=='('){ops.push('(');hasPrevNum=false;}elseif(c==')'){while(ops.peek()!='(')calc(nums,ops);ops.pop();// Pop '('}elseif(c=='+'||c=='-'||c=='*'||c=='/'){if(!hasPrevNum)nums.push(0);while(!ops.isEmpty()&&precedes(ops.peek(),c))calc(nums,ops);ops.push(c);}}while(!ops.isEmpty())calc(nums,ops);returnnums.peek();}privatevoidcalc(Deque<Integer>nums,Deque<Character>ops){finalintb=nums.pop();finalinta=nums.pop();finalcharop=ops.pop();if(op=='+')nums.push(a+b);elseif(op=='-')nums.push(a-b);elseif(op=='*')nums.push(a*b);else// Op == '/'nums.push(a/b);}// Returns true if prevOp is a operator and// Priority(prevOp) >= priority(currOp)privatebooleanprecedes(charprevOp,charcurrOp){if(prevOp=='(')returnfalse;returnprevOp=='*'||prevOp=='/'||currOp=='+'||currOp=='-';}}
classSolution:defcalculate(self,s:str)->int:nums=[]ops=[]defcalc():b=nums.pop()a=nums.pop()op=ops.pop()ifop=='+':nums.append(a+b)elifop=='-':nums.append(a-b)elifop=='*':nums.append(a*b)else:# Op == '/'nums.append(int(a/b))# Returns true if prevOp is a operator and# Priority(prevOp) >= priority(currOp)defprecedes(prevOp:chr,currOp:chr)->bool:ifprevOp=='(':returnFalsereturnprevOpin'*/'orcurrOpin'+-'i=0hasPrevNum=Falsewhilei<len(s):c=s[i]ifc.isdigit():num=ord(c)-ord('0')whilei+1<len(s)ands[i+1].isdigit():num=num*10+(ord(s[i+1])-ord('0'))i+=1nums.append(num)hasPrevNum=Trueelifc=='(':ops.append('(')hasPrevNum=Falseelifc==')':whileops[-1]!='(':calc()ops.pop()# Pop '('elifcin'+-*/':ifnothasPrevNum:# Handle input like "-1-(-1)"num.append(0)whileopsandprecedes(ops[-1],c):calc()ops.append(c)i+=1whileops:calc()returnnums.pop()