Identify and mark unmatched parenthesis in an expression - GeeksforGeeks

31 Aug, 2021
Given an expression, find and mark matched and unmatched parenthesis in it. We need to replace all balanced opening parenthesis with 0, balanced closing parenthesis with 1, and all unbalanced with -1.Examples:  
Input : ((a) 
Output : -10a1

Input : (a))
Output : 0a1-1

Input  : (((abc))((d)))))
Output : 000abc1100d111-1-1
The idea is based on a stack. We run a loop from the start of the string Up to end and for every ‘(‘, we push it into a stack. If the stack is empty, and we encounter a closing bracket ‘)’ we replace -1 at that index of the string. Else we replace all opening brackets ‘(‘ with 0 and closing brackets with 1. Then pop from the stack.  
C++
Java
Python3
C#
Javascript
// CPP program to mark balanced and unbalanced// parenthesis.#include <bits/stdc++.h>using namespace std; void identifyParenthesis(string a){    stack<int> st;     // run the loop upto end of the string    for (int i = 0; i < a.length(); i++) {         // if a[i] is opening bracket then push        // into stack        if (a[i] == '(')            st.push(i);                 // if a[i] is closing bracket ')'        else if (a[i] == ')') {             // If this closing bracket is unmatched            if (st.empty())                a.replace(i, 1, "-1");                         else {                 // replace all opening brackets with 0                // and closing brackets with 1                a.replace(i, 1, "1");                a.replace(st.top(), 1, "0");                st.pop();            }        }    }     // if stack is not empty then pop out all    // elements from it and replace -1 at that    // index of the string    while (!st.empty()) {        a.replace(st.top(), 1, "-1");        st.pop();    }     // print final string    cout << a << endl;} // Driver codeint main(){    string str = "(a))";    identifyParenthesis(str);    return 0;}
// Java program to mark balanced and// unbalanced parenthesis.import java.util.*; class GFG{static void identifyParenthesis(StringBuffer a){    Stack<Integer> st = new Stack<Integer>();     // run the loop upto end of the string    for (int i = 0; i < a.length(); i++)    {         // if a[i] is opening bracket then push        // into stack        if (a.charAt(i) == '(')            st.push(i);                 // if a[i] is closing bracket ')'        else if (a.charAt(i) == ')')        {             // If this closing bracket is unmatched            if (st.empty())                a.replace(i, i + 1, "-1");                         else            {                 // replace all opening brackets with 0                // and closing brackets with 1                a.replace(i, i + 1, "1");                a.replace(st.peek(), st.peek() + 1, "0");                st.pop();            }        }    }     // if stack is not empty then pop out all    // elements from it and replace -1 at that    // index of the string    while (!st.empty())    {        a.replace(st.peek(), 1, "-1");        st.pop();    }     // print final string    System.out.println(a);} // Driver codepublic static void main(String[] args){    StringBuffer str = new StringBuffer("(a))");    identifyParenthesis(str);}} // This code is contributed by Princi Singh
# Python3 program to# mark balanced and# unbalanced parenthesis.def identifyParenthesis(a):    st = []     # run the loop upto    # end of the string    for i in range (len(a)):         # if a[i] is opening        # bracket then push        # into stack        if (a[i] == '('):            st.append(a[i])                 # if a[i] is closing bracket ')'        elif (a[i] == ')'):             # If this closing bracket            # is unmatched            if (len(st) == 0):                a = a.replace(a[i], "-1", 1)                         else:                 # replace all opening brackets with 0                # and closing brackets with 1                a = a.replace(a[i], "1", 1)                a = a.replace(st[-1], "0", 1)                st.pop()               # if stack is not empty    # then pop out all    # elements from it and    # replace -1 at that    # index of the string    while (len(st) != 0):        a = a.replace(st[-1], 1, "-1");        st.pop()     # print final string    print(a) # Driver codeif __name__ == "__main__":     st = "(a))"    identifyParenthesis(st)     # This code is contributed by Chitranayal
// C# program to mark balanced and// unbalanced parenthesis.using System;using System.Collections.Generic;class GFG {         static void identifyParenthesis(string a)    {        Stack<int> st = new Stack<int>();          // run the loop upto end of the string        for (int i = 0; i < a.Length; i++)        {              // if a[i] is opening bracket then push            // into stack            if (a[i] == '(')                st.Push(i);              // if a[i] is closing bracket ')'            else if (a[i] == ')')            {                  // If this closing bracket is unmatched                if (st.Count == 0)                {                    a = a.Substring(0, i) + "-1" + a.Substring(i + 1);                }                else                {                      // replace all opening brackets with 0                    // and closing brackets with 1                    a = a.Substring(0, i) + "1" + a.Substring(i + 1);                    a = a.Substring(0, st.Peek()) + "0" + a.Substring(st.Peek() + 1);                    st.Pop();                }            }        }          // if stack is not empty then pop out all        // elements from it and replace -1 at that        // index of the string        while (st.Count > 0)        {            a = a.Substring(0, st.Peek()) + "-1" + a.Substring(st.Peek() + 1);            st.Pop();        }          // print final string        Console.Write(new string(a));    }       static void Main() {    string str = "(a))";    identifyParenthesis(str);  }} // This code is contributed by divyesh072019.
<script>    // Javascript program to mark balanced and    // unbalanced parenthesis.         function identifyParenthesis(a)    {        let st = [];         // run the loop upto end of the string        for (let i = 0; i < a.length; i++)        {             // if a[i] is opening bracket then push            // into stack            if (a[i] == '(')                st.push(i);             // if a[i] is closing bracket ')'            else if (a[i] == ')')            {                 // If this closing bracket is unmatched                if (st.length == 0)                {                    a[i] = "-1";                }                else                {                     // replace all opening brackets with 0                    // and closing brackets with 1                    a[i] = "1";                    a[st[st.length - 1]] = "0";                    st.pop();                }            }        }         // if stack is not empty then pop out all        // elements from it and replace -1 at that        // index of the string        while (st.length > 0)        {            a[st[st.length - 1]] = "-1";            st.pop();        }         // print final string        document.write(a.join(""));    }         let str = "(a))";    identifyParenthesis(str.split('')); // This code is contributed by suresh07.</script>
Output:  
0a1-1
 
HARDY_123
princi singh
ukasp
suresh07
divyesh072019
cpp-stack
Stack
Strings
Strings
Stack
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Real-time application of Data Structures
Sort a stack using a temporary stack
Reverse individual words
Iterative Tower of Hanoi
ZigZag Tree Traversal
Reverse a string in Java
Write a program to reverse an array or string
C++ Data Types
Write a program to print all permutations of a given string
Longest Common Subsequence | DP-4