求解字符串给出的逻辑表达式
给定字符串str表示由运算符|组成的逻辑表达式(或) , & (与) , ! (NOT) , 0 , 1和, only (即字符之间没有空格)。任务是打印逻辑表达式的结果。
例子:
Input: str = “[[0,&,1],|,[!,1]]”
Output: 0
[[0,&,1],|,[!,1]]
[[0,&,1],|,0]
[[0,&,1],|,0]
[0,|,0]
[0,|,0]
[0]
0
Input: str = “[!,[[0,&,[!,1]],|,[!,[[!,0],&,1]]]]”
Output: 1
方法:
- 从末尾开始遍历字符串。
- 如果[找到转到第 3 步,否则将字符推入堆栈。
- 从堆栈中弹出字符,直到堆栈顶部变为“]”。 > 将每个弹出的字符插入向量中。
- 如果栈顶在 5 次弹出操作后变为] ,则向量将为x、|、y或x、&、y 。
- 如果堆栈顶部在 3 次弹出操作后变为] ,则向量将为!, x 。
- 从堆栈顶部弹出] 。
- 对向量元素执行相应的操作,然后将结果推回堆栈。
- 如果字符串被完全遍历,则返回堆栈顶部的值,否则转到步骤 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 是字符串的长度。