Given an expression exp of length n consisting of some brackets. The task is to print the bracket numbers when the expression is being parsed.
Examples :
Input : (a+(b*c))+(d/e) Output : 1 2 2 1 3 3 The highlighted brackets in the given expression (a+(b*c))+(d/e) has been assigned the numbers as: 1 2 2 1 3 3. Input : ((())(())) Output : 1 2 3 3 2 4 5 5 4 1
Source: Flipkart Interview Experience | Set 49.
Approach :
- Define a variable left_bnum = 1.
- Create a stack right_bnum.
- Now, for i = 0 to n-1.
- If exp[i] == ‘(‘, then print left_bnum, push left_bnum on to the stack right_bnum and finally increment left_bnum by 1.
- Else if exp[i] == ‘)’, then print the top element of the stack right_bnum and then pop the top element from the stack.
Implementation:
C++
// C++ implementation to print the bracket number #include <bits/stdc++.h> using namespace std;
// function to print the bracket number void printBracketNumber(string exp , int n)
{ // used to print the bracket number
// for the left bracket
int left_bnum = 1;
// used to obtain the bracket number
// for the right bracket
stack< int > right_bnum;
// traverse the given expression 'exp'
for ( int i = 0; i < n; i++) {
// if current character is a left bracket
if ( exp [i] == '(' ) {
// print 'left_bnum',
cout << left_bnum << " " ;
// push 'left_bnum' on to the stack 'right_bnum'
right_bnum.push(left_bnum);
// increment 'left_bnum' by 1
left_bnum++;
}
// else if current character is a right bracket
else if ( exp [i] == ')' ) {
// print the top element of stack 'right_bnum'
// it will be the right bracket number
cout << right_bnum.top() << " " ;
// pop the top element from the stack
right_bnum.pop();
}
}
} // Driver program to test above int main()
{ string exp = "(a+(b*c))+(d/e)" ;
int n = exp .size();
printBracketNumber( exp , n);
return 0;
} |
Java
// Java implementation to // print the bracket number import java.io.*;
import java.util.*;
class GFG
{ // function to print
// the bracket number
static void printBracketNumber(String exp,
int n)
{
// used to print the
// bracket number for
// the left bracket
int left_bnum = 1 ;
// used to obtain the
// bracket number for
// the right bracket
Stack<Integer> right_bnum =
new Stack<Integer>();
// traverse the given
// expression 'exp'
for ( int i = 0 ; i < n; i++)
{
// if current character
// is a left bracket
if (exp.charAt(i) == '(' )
{
// print 'left_bnum',
System.out.print(
left_bnum + " " );
// push 'left_bnum' on to
// the stack 'right_bnum'
right_bnum.push(left_bnum);
// increment 'left_bnum' by 1
left_bnum++;
}
// else if current character
// is a right bracket
else if (exp.charAt(i) == ')' )
{
// print the top element
// of stack 'right_bnum'
// it will be the right
// bracket number
System.out.print(
right_bnum.peek() + " " );
// pop the top element
// from the stack
right_bnum.pop();
}
}
}
// Driver Code
public static void main(String args[])
{
String exp = "(a+(b*c))+(d/e)" ;
int n = exp.length();
printBracketNumber(exp, n);
}
} // This code is contributed // by Manish Shaw(manishshaw1) |
Python3
# Python3 implementation to print the bracket number # function to print the bracket number def printBracketNumber(exp, n):
# used to print the bracket number
# for the left bracket
left_bnum = 1
# used to obtain the bracket number
# for the right bracket
right_bnum = list ()
# traverse the given expression 'exp'
for i in range (n):
# if current character is a left bracket
if exp[i] = = '(' :
# print 'left_bnum',
print (left_bnum, end = " " )
# push 'left_bnum' on to the stack 'right_bnum'
right_bnum.append(left_bnum)
# increment 'left_bnum' by 1
left_bnum + = 1
# else if current character is a right bracket
elif exp[i] = = ')' :
# print the top element of stack 'right_bnum'
# it will be the right bracket number
print (right_bnum[ - 1 ], end = " " )
# pop the top element from the stack
right_bnum.pop()
# Driver Code if __name__ = = "__main__" :
exp = "(a+(b*c))+(d/e)"
n = len (exp)
printBracketNumber(exp, n)
# This code is contributed by # sanjeev2552 |
C#
// C# implementation to // print the bracket number using System;
using System.Collections.Generic;
class GFG
{ // function to print
// the bracket number
static void printBracketNumber( string exp,
int n)
{
// used to print the bracket
// number for the left bracket
int left_bnum = 1;
// used to obtain the bracket
// number for the right bracket
Stack< int > right_bnum = new Stack< int >();
// traverse the given
// expression 'exp'
for ( int i = 0; i < n; i++)
{
// if current character
// is a left bracket
if (exp[i] == '(' )
{
// print 'left_bnum',
Console.Write(left_bnum + " " );
// Push 'left_bnum' on to
// the stack 'right_bnum'
right_bnum.Push(left_bnum);
// increment 'left_bnum' by 1
left_bnum++;
}
// else if current character
// is a right bracket
else if (exp[i] == ')' )
{
// print the top element
// of stack 'right_bnum'
// it will be the right
// bracket number
Console.Write(right_bnum.Peek() + " " );
// Pop the top element
// from the stack
right_bnum.Pop();
}
}
}
// Driver Code
static void Main()
{
string exp = "(a+(b*c))+(d/e)" ;
int n = exp.Length;
printBracketNumber(exp, n);
}
} // This code is contributed // by Manish Shaw(manishshaw1) |
PHP
<?php // PHP implementation to // print the bracket number // function to print // the bracket number function printBracketNumber( $exp , $n )
{ // used to print the
// bracket number for
// the left bracket
$left_bnum = 1;
// used to obtain the
// bracket number for
// the right bracket
$right_bnum = array ();
$t = 0;
// traverse the given
// expression 'exp'
for ( $i = 0; $i < $n ; $i ++)
{
// if current character
// is a left bracket
if ( $exp [ $i ] == '(' )
{
// print 'left_bnum',
echo $left_bnum . " " ;
// push 'left_bnum' on to
// the stack 'right_bnum'
$right_bnum [ $t ++] = $left_bnum ;
// increment 'left_bnum' by 1
$left_bnum ++;
}
// else if current character
// is a right bracket
else if ( $exp [ $i ] == ')' )
{
// print the top element
// of stack 'right_bnum'
// it will be the right
// bracket number
echo $right_bnum [ $t - 1] . " " ;
// pop the top element
// from the stack
$right_bnum [ $t - 1] = 1;
$t --;
}
}
} // Driver Code $exp = "(a+(b*c))+(d/e)" ;
$n = strlen ( $exp );
printBracketNumber( $exp , $n );
// This code is contributed // by mits ?> |
Javascript
<script> // Javascript implementation to print the bracket number // function to print the bracket number function printBracketNumber(exp, n)
{ // used to print the bracket number
// for the left bracket
var left_bnum = 1;
// used to obtain the bracket number
// for the right bracket
var right_bnum = [];
// traverse the given expression 'exp'
for ( var i = 0; i < n; i++) {
// if current character is a left bracket
if (exp[i] == '(' ) {
// print 'left_bnum',
document.write( left_bnum + " " );
// push 'left_bnum' on to the stack 'right_bnum'
right_bnum.push(left_bnum);
// increment 'left_bnum' by 1
left_bnum++;
}
// else if current character is a right bracket
else if (exp[i] == ')' ) {
// print the top element of stack 'right_bnum'
// it will be the right bracket number
document.write( right_bnum[right_bnum.length-1] + " " );
// pop the top element from the stack
right_bnum.pop();
}
}
} // Driver program to test above var exp = "(a+(b*c))+(d/e)" ;
var n = exp.length;
printBracketNumber(exp, n); </script> |
Output:
1 2 2 1 3 3
Time Complexity : O(n).
Auxiliary Space : O(n).