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:
s = "1 + 1"Output:
2🔹 Example 2:
Input:
Output:
🔹 Example 3:
Input:
Output:
Constraints ⚙️
1 <= s.length <= 3 * 10^5sconsists of digits, '+', '-', '(', ')', and spaces' '.srepresents 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 thesignaccordingly. 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
nis 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