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

โปรแกรมเพื่อประเมิน s-expression เป็นสตริงใน Python


สมมติว่าเรามีสตริง s เป็น S-expression เราต้องประเมินว่านิพจน์ S และส่งคืนผลลัพธ์เป็นจำนวนเต็ม ดังที่เราทราบแล้วว่า s-expression เป็นนิพจน์ที่เป็นหนึ่งตัวเลข หรือนิพจน์แบบเรียกซ้ำที่อยู่ในวงเล็บ เช่น (+ (- 3 2) (* 3 3)) ซึ่งระบุ (3 - 2) + (3 * 3) =10. ตัวดำเนินการที่ถูกต้องคือ +, -, * และ /.

ดังนั้น หากอินพุตเป็น s ="(- (+ 3 2) 2)" ผลลัพธ์จะเป็น 3 เนื่องจาก ((3 + 2) - 2) =3

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

  • stack :=สแต็คใหม่

  • ลบวงเล็บเปิดและปิดของ s

  • a :=แบ่ง s โดยใช้ช่องว่างและสร้างรายการพาร์ติชั่น

  • สำหรับแต่ละ i ในลำดับที่กลับกัน ทำ

    • ถ้าขนาด i> 1 แล้ว

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

        • ดัน i เป็นจำนวนเต็มลงใน stack

        • ไปทำซ้ำต่อไป

      • มิฉะนั้น

        • ดัน i เป็นจำนวนเต็มลงใน stack

    • มิฉะนั้นเมื่อฉันเป็นตัวเลขแล้ว

      • ดัน i เป็นจำนวนเต็มลงใน stack

    • มิฉะนั้น

      • ถ้าขนาดของ stack>=2 แล้ว

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

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

        • ถ้าฉันเหมือนกับ "+" แล้ว

          • ดำเนินการ num1 + num2 แล้วดันเข้าไปในสแต็ก

        • มิฉะนั้นเมื่อฉันเหมือนกับ "-" แล้ว

          • ดำเนินการ num1 - num2 และผลักเข้าสู่สแต็ก

        • มิฉะนั้นเมื่อฉันเหมือนกับ "*" แล้ว

          • ดำเนินการ num1 * num2 และกดลงในสแต็ก

        • มิฉะนั้น

          • ดำเนินการ num1 / num2 และผลักเข้าสู่สแต็ก

  • ส่งคืนองค์ประกอบบนสุดจากสแต็ก และลบองค์ประกอบบนสุด

ตัวอย่าง

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

class Solution:
   def solve(self, s):
      stack = list()
      s = s.replace("(", "")
      s = s.replace(")", "")
      a = s.split()
      for i in a[::-1]:
         if len(i) > 1:
            if i[0] == "-":
               stack.append(int(i))
               continue
            else:
               stack.append(int(i))
         elif i.isdigit():
            stack.append(int(i))
         else:
            if len(stack) >= 2:
               num1 = stack.pop()
               num2 = stack.pop()
               if i == "+":
                  stack.append(int(num1 + num2))
               elif i == "-":
                  stack.append(int(num1 - num2))
               elif i == "*":
                  stack.append(int(num1 * num2))
               else:
                  stack.append(int(num1 / num2))
      return stack.pop()
ob = Solution()
s = "(- (+ 3 2) 2)"
print(ob.solve(s))

อินพุต

s = "(- (+ 3 2) 2)"

ผลลัพธ์

3