Javatpoint Logo
Javatpoint Logo

Check for Balanced Brackets in an expression

Introduction:

Balanced brackets play a crucial role in programming languages and mathematical expressions. They ensure that the syntax is correct and that the code or expression can be interpreted without errors. Checking for balanced brackets is a common task in programming.

Understanding Balanced Brackets:

In programming, brackets come in different forms: parentheses '()', square brackets '[]', and curly braces '{}'. An expression is considered to have balanced brackets if every opening bracket has a corresponding closing bracket in the correct order.

For example:

"(a + b)" is balanced.

"{[x + y] * z}" is balanced.

"((a + b)" is not balanced.

"{[x + y) * z}" is not balanced.

Why Balanced Brackets are Important:

Balanced brackets are essential for maintaining the syntactical integrity of expressions in programming languages. They are commonly used in mathematical expressions, conditional statements, loops, and various data structures like stacks. An expression with unbalanced brackets can lead to syntax errors, logical errors, or unexpected program behavior. Therefore, it is crucial to verify the balance of brackets in an expression.

For example, consider the expression if (x > 0 { print("Positive"); }. Here, the missing closing parenthesis in the if statement can cause a compilation error or lead to incorrect program execution.

The Challenge of Balancing Brackets:

The task of checking for balanced brackets involves examining an expression and verifying whether each opening bracket has a corresponding closing bracket in the correct order. Various types of brackets must be considered, and the nesting of brackets adds complexity to the problem. A robust algorithm is required to efficiently handle different scenarios and identify imbalances accurately.

Algorithm to Check for Balanced Brackets:

To check for balanced brackets in an expression, we can use a stack data structure. The algorithm involves iterating through the expression and pushing opening brackets onto the stack. When a closing bracket is encountered, we check if the stack is empty. If it is not, we pop the top element from the stack and compare it with the current closing bracket. If they match, we continue the process. If the stack is empty or the brackets do not match, the expression is unbalanced.

Implementation:

Explanation:

  • The areBracketsBalanced function takes a string expression as its parameter and returns a boolean value indicating whether the brackets in the expression are balanced or not.
  • It initializes an empty stack (bracketStack) to store the opening brackets encountered during the iteration over the characters of the input expression.
  • The program uses a for loop to iterate through each character in the expression.
  • If the character is an opening bracket ('(', '{', or '['), it is pushed onto the stack.
  • If the character is a closing bracket (')', '}', or ']'), the program checks if the stack is empty. If it is, the expression is considered unbalanced because there is no matching opening bracket for the current closing bracket.
  • If the stack is not empty, the program retrieves the top element from the stack (the last opening bracket encountered) and compares it with the current closing bracket.
  • If they do not match, the expression is considered unbalanced. The loop continues until all characters in the expression have been processed.
  • After the loop, the program checks if the stack is empty. If it is, the expression is considered balanced because all opening brackets have been matched with their corresponding closing brackets.
  • If the stack is not empty, it means there are unmatched opening brackets, and the expression is considered unbalanced.
  • In the main function, the user is prompted to enter an expression using std::cin.
  • The areBracketsBalanced function is then called with the entered expression, and the program outputs whether the expression is balanced or unbalanced based on the result.

Program Output:

Check for Balanced Brackets in an expression

Time and Space Complexity (With Stack):

Time Complexity:

The time complexity of this approach is also O(n), where 'n' is the length of the input expression. In the worst case, each character in the expression is processed once. Pushing and popping from the stack, as well as comparisons, are all constant time operations.

Space Complexity:

The space complexity is O(n) in the worst case. This is because, in the worst scenario, all opening brackets might be pushed onto the stack before encountering the closing brackets. Therefore, the space required by the stack is proportional to the number of opening brackets in the expression.

Another Approach:

An alternative approach to checking for balanced brackets without using a stack involves iterating through the expression and keeping track of the balance using a counter. This approach uses a single integer variable to represent the balance, incrementing it for each opening bracket and decrementing it for each closing bracket. If the balance becomes negative at any point or is not zero at the end, the expression is unbalanced.

Implementation:

Explanation:

  • The program defines a function areBracketsBalanced that takes a constant reference to a string (expression) as its parameter and returns a boolean value indicating whether the brackets in the expression are balanced or not.
  • Inside the function, a variable balance is initialized to zero. The function then iterates through each character in the input expression using a range-based for loop.
  • For each character, it checks if it is an opening bracket ('(', '{', or '['). If it is, the balance variable is incremented.
  • On the other hand, if the character is a closing bracket (')', '}', or ']'), the balance variable is decremented.
  • Additionally, the program checks if the balance becomes negative at any point during the iteration. If it does, the function returns false, indicating that the expression is unbalanced.
  • After processing all characters in the expression, the function checks if the final value of balance is zero. If it is, the function returns true, indicating that the expression is balanced. Otherwise, it returns false.
  • In the main function, the program prompts the user to enter an expression using std::cout.
  • It then reads the input expression from the user using std::cin.
  • The entered expression is then passed to the areBracketsBalanced function, and the result is used to output whether the expression is balanced or unbalanced using std::cout.

Program Output:

Check for Balanced Brackets in an expression

Time and Space Complexity (Without Stack):

Time Complexity:

The algorithm has a linear time complexity, O(n), where 'n' is the length of the input expression. This is because each character in the expression is processed once, and the operations performed (incrementing, decrementing, and comparisons) are constant time operations.

Space Complexity:

The space complexity is O(1), which means the algorithm uses constant space regardless of the size of the input expression. This is because the algorithm only uses a single integer variable (balance) to keep track of the balance of brackets. The space required for this variable is constant, independent of the length of the input expression.

Conclusion:

In conclusion, the task of checking for balanced brackets in an expression is a fundamental problem in computer science and plays a crucial role in various applications such as compiler design, text processing, and parsing. The significance of this problem lies in its ability to ensure the syntactic correctness of expressions, preventing errors that could lead to unexpected behavior in programs.

The algorithmic approaches discussed in this context range from stack-based methods to recursive algorithms, each with its own advantages and trade-offs. The stack-based approach, for instance, leverages the Last In, First Out (LIFO) property of stacks to efficiently track and verify the balance of brackets in an expression.

Efficiency and simplicity are key considerations in choosing an appropriate algorithm for checking balanced brackets. The stack-based method is often favored for its simplicity and linear time complexity. Real-world scenarios may involve additional constraints or considerations that influence the selection of an algorithm, making it essential for developers to carefully evaluate the trade-offs involved.







Youtube For Videos Join Our Youtube Channel: Join Now

Feedback


Help Others, Please Share

facebook twitter pinterest

Learn Latest Tutorials


Preparation


Trending Technologies


B.Tech / MCA