কম্পিউটার টিউটোরিয়াল

পাইথনে S-এক্সপ্রেশন মূল্যায়ন করার প্রোগ্রাম


একটি স্ট্রিং s দেওয়া আছে যা S-এক্সপ্রেশন হিসেবে দেওয়া হয়েছে। এটিকে মূল্যায়ন করে ফলাফল পূর্ণসংখ্যা আকারে রিটার্ন করতে হবে। S-এক্সপ্রেশন হলো এমন একটি এক্সপ্রেশন যা হয় একটি সংখ্যা, অথবা প্যারেনথেসিসে মুড়ে একটি রিকারসিভ এক্সপ্রেশন যেমন (+ (- 3 2) (* 3 3)), যা নির্দেশ করে (3 - 2) + (3 * 3) = 10। এখানে বৈধ অপারেটরগুলো হলো +, -, *, এবং /।

ইনপুট হলে s = "(- (+ 3 2) 2)", আউটপুট হবে 3, কারণ ((3 + 2) - 2) = 3।

সমাধানের পদ্ধতি

  1. stack := একটি নতুন স্ট্যাক
  2. s-র ওপেনিং এবং ক্লোজিং প্যারেনথেসিস মুছে দিন
  3. a := s.split() দিয়ে স্পেস দিয়ে ভাগ করে লিস্ট বানান
  4. a-র রিভার্স অর্ডারে প্রতিটি টোকেন i প্রসেস করুন:
    • যদি len(i) > 1 হয়:
      • যদি i[0] == "-" হয় (নেগেটিভ সংখ্যা), তবে int(i) স্ট্যাকে পুশ করুন এবং কন্টিনিউ করুন
      • অন্যথায় int(i) স্ট্যাকে পুশ করুন
    • অন্যথায় যদি i.isdigit() হয়, তবে int(i) স্ট্যাকে পুশ করুন
    • অন্যথায় (অপারেটর হলে):
      • যদি স্ট্যাকে কমপক্ষে ২টি উপাদান থাকে, তবে দুটি পপ করুন (num1, num2)
      • i অনুযায়ী অপারেশন করে ফলাফল স্ট্যাকে পুশ করুন
  5. স্ট্যাকে থেকে টপ এলিমেন্ট পপ করে রিটার্ন করুন

উদাহরণ

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
  1. হেক্সাডেসিমেল স্ট্রিংকে দশমিকে রূপান্তর করার পাইথন প্রোগ্রাম

  2. পাইথনে স্ট্রিং-এ একটি শব্দের ঘটনার সংখ্যা গণনা

  3. পাইথন প্রোগ্রাম: স্ট্রিং-এ URL চেক করা

  4. পাইথন প্রোগ্রাম: স্ট্রিং-এ মিরর ক্যারেক্টার বের করা