224. Basic Calculator ๐งฎ
Difficulty: Hard
- Tags: Stack
, Mathematical Expression
Problem Statement ๐
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()
.
Examples ๐
๐น Example 1:
Input:
Output:
๐น Example 2:
Input:
Output:
๐น Example 3:
Input:
Output:
Constraints โ๏ธ
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.
Solution ๐ก
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.
Approach:
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.
Java Solution
Explanation of the Solution
Building the Number: As we iterate through the string, we build numbers by accumulating digits.
Sign Management: When encountering a
+
or-
, we set thesign
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.
Time Complexity โณ
O(n): We iterate over the string once, where
n
is the length of the string.
Space Complexity ๐พ
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 here.
Last updated