Given string str representing a logical expression which consists of the operators | (OR), & (AND),! (NOT) , 0, 1 and, only (i.e. no space between characters). The task is to print the result of the logical expression.
Examples:
Input: str = “[[0,&,1],|,[!,1]]”
Output: 0
Explanation:
[[0,&,1],|,[!,1]]
[[0,&,1],|,0]
[[0,&,1],|,0]
[0,|,0]
[0,|,0]
[0]
0Input: str = “[!,[[0,&,[!,1]],|,[!,[[!,0],&,1]]]]”
Output: 1
Approach:
- Start traversing the string from the end.
- If [ found go to Step-3 otherwise push the characters into the stack.
- Pop characters from the stack until the stack top becomes”]”. > Insert each popped character into the vector.
- If the stack top becomes ] after 5 pop operations then the vector will be x, |, y or x, &, y.
- If the stack top becomes ] after 3 pop operations then the vector will be !, x.
- Pop ] from the stack top.
- Perform the respective operations on the vector elements then push the result back into the stack.
- If the string is fully traversed then return the value at the stack top otherwise go to step 2.
Below is the implementation of the above approach:
C++
// C++ program to solve the logical expression. #include <bits/stdc++.h> using namespace std;
// Function to evaluate the logical expression char logicalExpressionEvaluation(string str)
{ stack< char > arr;
// traversing string from the end.
for ( int i = str.length() - 1; i >= 0; i--)
{
if (str[i] == '[' )
{
vector< char > s;
while (arr.top() != ']' )
{
s.push_back(arr.top());
arr.pop();
}
arr.pop();
// for NOT operation
if (s.size() == 3)
{
s[2] == '1' ? arr.push( '0' ) : arr.push( '1' );
}
// for AND and OR operation
else if (s.size() == 5)
{
int a = s[0] - 48, b = s[4] - 48, c;
s[2] == '&' ? c = a && b : c = a || b;
arr.push(( char )c + 48);
}
}
else
{
arr.push(str[i]);
}
}
return arr.top();
} // Driver code int main()
{ string str = "[[0,&,1],|,[!,1]]" ;
cout << logicalExpressionEvaluation(str) << endl;
return 0;
} |
Java
// Java program to solve the logical expression. import java.util.*;
class GFG
{ // Function to evaluate the logical expression static char logicalExpressionEvaluation(String str)
{ Stack<Character> arr = new Stack<Character>();
// traversing string from the end.
for ( int i = str.length() - 1 ; i >= 0 ; i--)
{
if (str.charAt(i) == '[' )
{
Vector<Character> s = new Stack<Character>();
while (arr.peek() != ']' )
{
s.add(arr.peek());
arr.pop();
}
arr.pop();
// for NOT operation
if (s.size() == 3 )
{
arr.push(s.get( 2 ) == '1' ? '0' : '1' );
}
// for AND and OR operation
else if (s.size() == 5 )
{
int a = s.get( 0 ) - 48 ,
b = s.get( 4 ) - 48 , c;
if (s.get( 2 ) == '&' )
{
c = a & b;
}
else
{
c = a | b;
}
arr.push(( char )(c + 48 ));
}
}
else
{
arr.push(str.charAt(i));
}
}
return arr.peek();
} // Driver code public static void main(String[] args)
{ String str = "[[0,&,1],|,[!,1]]" ;
System.out.println(logicalExpressionEvaluation(str));
} } // This code is contributed by 29AjayKumar |
Python3
# Python3 program to solve the # logical expression. import math as mt
# Function to evaluate the logical expression def logicalExpressionEvaluation(string):
arr = list ()
# traversing string from the end.
n = len (string)
for i in range (n - 1 , - 1 , - 1 ):
if (string[i] = = "[" ):
s = list ()
while (arr[ - 1 ] ! = "]" ):
s.append(arr[ - 1 ])
arr.pop()
arr.pop()
# for NOT operation
if ( len (s) = = 3 ):
if s[ 2 ] = = "1" :
arr.append( "0" )
else :
arr.append( "1" )
# for AND and OR operation
elif ( len (s) = = 5 ):
a = int (s[ 0 ]) - 48
b = int (s[ 4 ]) - 48
c = 0
if s[ 2 ] = = "&" :
c = a & b
else :
c = a | b
arr.append((c) + 48 )
else :
arr.append(string[i])
return arr[ - 1 ]
# Driver code string = "[[0,&,1],|,[!,1]]"
print (logicalExpressionEvaluation(string))
# This code is contributed # by mohit kumar 29 |
C#
// C# program to solve the logical expression. using System;
using System.Collections.Generic;
public class GFG
{ // Function to evaluate the logical expression static char logicalExpressionEvaluation(String str)
{ Stack< char > arr = new Stack< char >();
// traversing string from the end.
for ( int i = str.Length - 1; i >= 0; i--)
{
if (str[i] == '[' )
{
List< char > s = new List< char >();
while (arr.Peek() != ']' )
{
s.Add(arr.Peek());
arr.Pop();
}
arr.Pop();
// for NOT operation
if (s.Count == 3)
{
arr.Push(s[2] == '1' ? '0' : '1' );
}
// for AND and OR operation
else if (s.Count == 5)
{
int a = s[0] - 48,
b = s[4] - 48, c;
if (s[2] == '&' )
{
c = a & b;
}
else
{
c = a | b;
}
arr.Push(( char )(c + 48));
}
}
else
{
arr.Push(str[i]);
}
}
return arr.Peek();
} // Driver code public static void Main(String[] args)
{ String str = "[[0,&,1],|,[!,1]]" ;
Console.WriteLine(logicalExpressionEvaluation(str));
} } // This code is contributed by PrinciRaj1992 |
Javascript
// C# program to solve the logical expression. using System; using System.Collections.Generic; public class GFG { // Function to evaluate the logical expression static char logicalExpressionEvaluation(String str) { Stack<char> arr = new Stack<char>();
// traversing string from the end.
for (int i = str.Length - 1; i >= 0; i--)
{
if (str[i] == '[' )
{
List<char> s = new List<char>();
while (arr.Peek() != ']' )
{
s.Add(arr.Peek());
arr.Pop();
}
arr.Pop();
// for NOT operation
if (s.Count == 3)
{
arr.Push(s[2] == '1' ? '0' : '1' );
}
// for AND and OR operation
else if (s.Count == 5)
{
int a = s[0] - 48,
b = s[4] - 48, c;
if (s[2] == '&' )
{
c = a & b;
}
else
{
c = a | b;
}
arr.Push((char)(c + 48));
}
}
else
{
arr.Push(str[i]);
}
}
return arr.Peek();
} // Driver code public static void Main(String[] args) { String str = "[[0,&,1],|,[!,1]]" ;
Console.WriteLine(logicalExpressionEvaluation(str));
} } // This code is contributed by PrinciRaj1992 |
Output
0
Complexity Analysis:
- Time Complexity: O(n) Here, n is the length of the string.
- Auxiliary Space: O(1)