📜  求解字符串给出的逻辑表达式

📅  最后修改于: 2022-05-13 01:57:05.780000             🧑  作者: Mango

求解字符串给出的逻辑表达式

给定字符串str表示由运算符|组成的逻辑表达式(或) , & (与) , ! (NOT) , 0 , 1, only (即字符之间没有空格)。任务是打印逻辑表达式的结果。
例子:

方法:

  1. 从末尾开始遍历字符串。
  2. 如果[找到转到第 3 步,否则将字符推入堆栈。
    • 从堆栈中弹出字符,直到堆栈顶部变为“]”。 > 将每个弹出的字符插入向量中。
    • 如果栈顶在 5 次弹出操作后变为] ,则向量将为x、|、yx、&、y
    • 如果堆栈顶部在 3 次弹出操作后变为] ,则向量将为!, x
    • 从堆栈顶部弹出]
  3. 对向量元素执行相应的操作,然后将结果推回堆栈。
  4. 如果字符串被完全遍历,则返回堆栈顶部的值,否则转到步骤 2。

下面是上述方法的实现:

C++
// C++ program to solve the logical expression.
#include 
using namespace std;
 
// Function to evaluate the logical expression
char logicalExpressionEvaluation(string str)
{
    stack arr;
 
    // traversing string from the end.
    for (int i = str.length() - 1; i >= 0; i--)
    {
        if (str[i] == '[')
        {
            vector 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 arr = new Stack();
 
    // traversing string from the end.
    for (int i = str.length() - 1; i >= 0; i--)
    {
        if (str.charAt(i) == '[')
        {
            Vector s = new Stack();
            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 = "[|,[&,1,[!,0]],[!,[|,[|,1,0],[!,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= "[|,[&,1,[!,0]],[!,[|,[|,1,0],[!,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 arr = new Stack();
  
    // traversing string from the end.
    for (int i = str.Length - 1; i >= 0; i--)
    {
        if (str[i] == '[')
        {
            List s = new List();
            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


输出
0

时间复杂度: O(n) 这里,n 是字符串的长度。