Python中布林表示式的解析


假設我們有一個布林表示式,我們需要找到評估該表示式後的結果。

表示式可以是:

  • "t",評估結果為True;

  • "f",評估結果為False;

  • "!(expression)",評估結果為內部表示式的邏輯非;

  • "&(expr1,expr2,...)",評估結果為兩個或多個內部表示式的邏輯與;

  • "|(expr1,expr2,...)",評估結果為兩個或多個內部表示式的邏輯或;

因此,如果輸入類似於"|(!(t),&(t,f,t))",則輸出將為false,這是因為!(t)為false,&(t,f,t)也為false,所以所有false值的或運算結果為false。

為了解決這個問題,我們將遵循以下步驟:

  • 定義solve()函式,它將接收e和i作為引數。

  • 如果e[i]等於"f",則:

    • 返回(False, i + 1)

  • 否則,如果e[i]等於"t":

  • 返回(True, i + 1)

  • op := e[i],i := i + 2

  • 定義一個棧

  • 當e[i]不是右括號時,執行:

    • 如果e[i]等於",",則:

      • i := i + 1

      • 忽略以下部分,跳到下一次迭代。

    • res, i := solve(e, i)

    • 將res壓入棧中。

  • 如果op等於"&",則:

    • 如果棧中所有元素都為true,則返回true,否則返回false,i + 1

  • 否則,如果op等於"|":

    • 如果棧中至少有一個元素為true,則返回true,否則返回false,i + 1

  • 返回(棧[0]的逆值, i + 1)

  • 在主方法中,執行以下操作:

  • s, y := solve(表示式, 0)

  • 返回s

讓我們看下面的實現來更好地理解:

示例

 線上演示

class Solution(object):
   def parseBoolExpr(self, expression):
      s,y = self.solve(expression,0)
      return s
   def solve(self,e,i):
      if e[i] =="f":
         return False,i+1
      elif e[i] == "t":
         return True,i+1
      op = e[i]
      i = i+2
      stack = []
      while e[i]!=")":
         if e[i] == ",":
            i+=1
            continue
         res,i = self.solve(e,i)
         stack.append(res)
      if op == "&":
         return all(stack),i+1
      elif op == "|":
         return any(stack),i+1
      return not stack[0],i+1
ob = Solution()
print(ob.parseBoolExpr("|(!(t),&(t,f,t))"))

輸入

"|(!(t),&(t,f,t))"

輸出

False

更新於:2020年6月4日

990 次檢視

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告