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
Was this helpful?