Use a stack to process numbers, signs (+1 / -1), and parentheses. Evaluate sub-expressions inside brackets and accumulate total sum.
def calculate(s: str) -> int:
stack = []
current_number = 0
result = 0
sign = 1 # 1 for '+', -1 for '-'
for char in s:
if char.isdigit():
# Build multi-digit numbers
current_number = (current_number * 10) + int(char)
elif char == '+':
# Evaluate current term and set next sign to positive
result += sign * current_number
sign = 1
current_number = 0
elif char == '-':
# Evaluate current term and set next sign to negative
result += sign * current_number
sign = -1
current_number = 0
elif char == '(':
# Step through portal: Save current result and sign
stack.append(result)
stack.append(sign)
# Reset for internal expression
result = 0
sign = 1
elif char == ')':
# Finish internal calculation
result += sign * current_number
# Pop sign and previous result to combine
result *= stack.pop() # Pop sign
result += stack.pop() # Pop prev_result
current_number = 0
return result + (sign * current_number)
class Solution {
public int calculate(String s) {
Stack stack = new Stack();
int result = 0;
int number = 0;
int sign = 1;
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(Character.isDigit(c)){
number = 10 * number + (int)(c - '0');
}else if(c == '+'){
result += sign * number;
number = 0;
sign = 1;
}else if(c == '-'){
result += sign * number;
number = 0;
sign = -1;
}else if(c == '('){
stack.push(result);
stack.push(sign);
result = 0;
sign = 1;
}else if(c == ')'){
result += sign * number;
number = 0;
result *= stack.pop();
result += stack.pop();
}
}
if(number != 0) result += sign * number;
return result;
}
}