Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมเพื่อประเมินนิพจน์บูลีนจากสตริงใน Python?


สมมติว่าเรามีสตริงที่มีนิพจน์บูลีนที่มีตัวดำเนินการ "และ" และ "หรือ" ประเมินและส่งคืนผลลัพธ์ ในที่นี้ นิพจน์อาจมีวงเล็บ ซึ่งควรประเมินก่อน

ดังนั้น หากอินพุตเป็น s ="T และ (F หรือ T)" ผลลัพธ์จะเป็น True

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:

  • stack :=รายการใหม่

  • t =รายการองค์ประกอบของ s แบ่งตามช่องว่าง

  • สำหรับแต่ละ v ใน t ทำ

    • ถ้า v[0] เหมือนกับ "(" แล้ว

      • ดันจริงเมื่อ v[จากดัชนีของ "(" ถึง end] เหมือนกับ "T" ลงในสแต็ก

    • มิฉะนั้นเมื่อพบ ")" แล้ว

      • ct :=จำนวนวงเล็บปิด ")" ใน v

      • ดันจริงเมื่อ v[จากดัชนี 0 ถึงขนาดของ v - ct] เท่ากับ "T" ลงในสแต็ก

      • สำหรับแต่ละค่าในช่วง 0 ถึง ct-1 ทำ

        • ขวา :=ป๊อปจากสแต็ก

  • :=ป๊อปจากสแต็ก

    • ซ้าย :=ป๊อปจากสแต็ก

    • ดำเนินการ (ซ้าย o ขวา) และดันเข้าไปในกอง

    • มิฉะนั้นเมื่อ v เป็น "T" หรือ "F" ดังนั้น

      • กดจริงเมื่อ v เหมือนกับ "T" ลงในสแต็ก

    • มิฉะนั้น

      • ดัน op[v] ลงใน stack

  • หากองค์ประกอบนับใน stack> 1 แล้ว

    • สำหรับฉันในช่วง 0 ถึงขนาดของสแต็ก - 1 เพิ่มขึ้น 2 ทำ

      • stack[i + 2] :=stack[i + 1](stack[i], stack[i + 2])

    • ส่งคืนองค์ประกอบด้านบนของ stack

  • ส่งคืนองค์ประกอบด้านล่างของ stack

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:

ตัวอย่าง

class Solution:
   def solve(self, s):
      stack = []
      op = {
         "or": lambda x, y: x or y,
         "and": lambda x, y: x and y,
      }
      for v in s.split():
         if v[0] == "(":
            stack.append(v[v.count("(") :] == "T")
         elif v.count(")") > 0:
            ct = v.count(")")
            stack.append(v[:-ct] == "T")
            for _ in range(ct):
               right = stack.pop()
               o = stack.pop()
               left = stack.pop()
               stack.append(o(left, right))
         elif v in ["T", "F"]:
            stack.append(v == "T")
         else:
            stack.append(op[v])

      if len(stack) > 1:
         for i in range(0, len(stack) - 1, 2):
            stack[i + 2] = stack[i + 1](stack[i], stack[i + 2])
         return stack[-1]

      return stack[0]

ob = Solution()
s = "T and (F or T)"
print(ob.solve(s))

อินพุต

"T and (F or T)"

ผลลัพธ์

True