224. Basic Calculator ๐งฎ
Last updated
Was this helpful?
Last updated
Was this helpful?
Difficulty: Hard
- Tags: Stack
, Mathematical Expression
Given a string s
representing a valid expression, implement a basic calculator to evaluate it and return the result of the evaluation.
Constraints:
You are not allowed to use any built-in function which evaluates strings as mathematical expressions, such as eval()
.
๐น Example 1:
Input:
Output:
๐น Example 2:
Input:
Output:
๐น Example 3:
Input:
Output:
1 <= s.length <= 3 * 10^5
s
consists of digits, '+', '-', '(', ')', and spaces ' '
.
s
represents a valid expression.
'+'
is not used as a unary operation (e.g., "+1"
and "+(2 + 3)"
are invalid).
'-'
can be used as a unary operation (e.g., "-1"
and "- (2 + 3)"
are valid).
There will be no two consecutive operators in the input.
Every number and running calculation will fit in a signed 32-bit integer.
To solve the problem, we need to handle:
Parentheses: We need to evaluate expressions within parentheses first.
Unary Minus: Handle negative numbers or expressions that start with a minus sign.
Operators: Handle addition and subtraction between numbers.
We will use a stack to handle nested parentheses and the accumulation of results as we process the string.
Iterate through the string:
If we encounter a number, accumulate it and push it onto the stack.
If we encounter an operator (+
or -
), record it for the next number.
If we encounter a parenthesis (
, push the current result and operator onto the stack and start a new scope.
If we encounter a closing parenthesis )
, calculate the result for that scope and return to the previous context.
Handle each number:
Consider negative numbers and numbers with multiple digits.
Handle operators:
For each operator, perform the addition or subtraction with the previous number or the current number if no previous number exists.
Building the Number: As we iterate through the string, we build numbers by accumulating digits.
Sign Management: When encountering a +
or -
, we set the sign
accordingly. If it's +
, we add the current number to the result; if it's -
, we subtract it.
Parentheses Handling:
When encountering a (
, we push the current result and sign onto the stack and reset them for the new expression inside the parentheses.
When encountering a )
, we complete the evaluation of the expression inside the parentheses by applying the sign and adding the result to the previous context.
Final Calculation: After the loop, we add any remaining number to the result.
O(n): We iterate over the string once, where n
is the length of the string.
O(n): In the worst case, we might need space for the stack that stores the results and signs of nested parentheses.
You can find the full solution .