একটি স্ট্রিং s দেওয়া আছে যা S-এক্সপ্রেশন হিসেবে দেওয়া হয়েছে। এটিকে মূল্যায়ন করে ফলাফল পূর্ণসংখ্যা আকারে রিটার্ন করতে হবে। S-এক্সপ্রেশন হলো এমন একটি এক্সপ্রেশন যা হয় একটি সংখ্যা, অথবা প্যারেনথেসিসে মুড়ে একটি রিকারসিভ এক্সপ্রেশন যেমন (+ (- 3 2) (* 3 3)), যা নির্দেশ করে (3 - 2) + (3 * 3) = 10। এখানে বৈধ অপারেটরগুলো হলো +, -, *, এবং /।
ইনপুট হলে s = "(- (+ 3 2) 2)", আউটপুট হবে 3, কারণ ((3 + 2) - 2) = 3।
সমাধানের পদ্ধতি
stack :=একটি নতুন স্ট্যাকs-র ওপেনিং এবং ক্লোজিং প্যারেনথেসিস মুছে দিনa := s.split()দিয়ে স্পেস দিয়ে ভাগ করে লিস্ট বানানa-র রিভার্স অর্ডারে প্রতিটি টোকেনiপ্রসেস করুন:- যদি
len(i) > 1হয়:- যদি
i[0] == "-"হয় (নেগেটিভ সংখ্যা), তবেint(i)স্ট্যাকে পুশ করুন এবং কন্টিনিউ করুন - অন্যথায়
int(i)স্ট্যাকে পুশ করুন
- যদি
- অন্যথায় যদি
i.isdigit()হয়, তবেint(i)স্ট্যাকে পুশ করুন - অন্যথায় (অপারেটর হলে):
- যদি স্ট্যাকে কমপক্ষে ২টি উপাদান থাকে, তবে দুটি পপ করুন (
num1,num2) iঅনুযায়ী অপারেশন করে ফলাফল স্ট্যাকে পুশ করুন
- যদি স্ট্যাকে কমপক্ষে ২টি উপাদান থাকে, তবে দুটি পপ করুন (
- যদি
- স্ট্যাকে থেকে টপ এলিমেন্ট পপ করে রিটার্ন করুন
উদাহরণ
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