ধরুন আমরা একটি মৌলিক ক্যালকুলেটর তৈরি করতে চাই যা মৌলিক অভিব্যক্তি ফলাফল খুঁজে বের করবে। অভিব্যক্তিটি খোলার এবং বন্ধ বন্ধনী, প্লাস বা বিয়োগ প্রতীক এবং খালি স্থান ধারণ করতে পারে।
তাই স্ট্রিং যদি “5 + 2 - 3” এর মত হয়, তাহলে ফলাফল হবে 7
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
ret :=0, চিহ্ন :=1, সংখ্যা :=0, n :=s এর আকার
-
একটি স্ট্যাক স্ট্যাক সংজ্ঞায়িত করুন
-
শুরু করার জন্য i :=0, যখন i
দ্বারা বাড়ান -
একটি অ্যারে x =s আকার i
সংজ্ঞায়িত করুন -
যদি x>='0' এবং x <='9', তাহলে,
-
সংখ্যা =সংখ্যা * 10
-
num =num + (x - '0')
-
-
অন্যথায় যখন x '(' এর মত হয়, তখন −
-
ret =ret + (চিহ্ন * সংখ্যা)
-
st
এ ret ঢোকান -
st
-এ সাইন ইনসার্ট করুন -
ret :=0, চিহ্ন :=1, সংখ্যা :=0
-
-
অন্যথায় যখন x ')' এর মত হয়, তখন −
-
ret =ret + (চিহ্ন * সংখ্যা), চিহ্ন :=1, সংখ্যা :=0
-
ret =ret * st এর শীর্ষ উপাদান
-
st
থেকে আইটেম মুছুন -
ret =ret + st এর শীর্ষ উপাদান
-
st
থেকে আইটেম মুছুন
-
-
অন্যথায় যখন x '+' এর মত হয়, তখন −
-
ret =ret + (চিহ্ন * সংখ্যা), চিহ্ন :=1, সংখ্যা :=0
-
-
অন্যথায় যখন x '-' এর মত হয়, তখন −
-
ret =ret + (চিহ্ন * সংখ্যা), চিহ্ন :=- 1, সংখ্যা :=0
-
-
-
যদি সংখ্যাটি অ-শূন্য হয়, তাহলে,
-
ret =ret + চিহ্ন * সংখ্যা
-
-
রিটার্ন রিটার্ন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h> using namespace std; class Solution { public: int calculate(string s) { int ret = 0; int sign = 1; int num = 0; int n = s.size(); stack <int> st; for(int i = 0; i < n; ++i){ char x = s[i]; if(x >= '0' && x <= '9'){ num *= 10; num += (x - '0'); } else if(x == '('){ ret += (sign * num); st.push(ret); st.push(sign); ret = 0; sign = 1; num = 0; } else if(x == ')'){ ret += (sign * num); sign = 1; num = 0; ret *= st.top(); st.pop(); ret += st.top(); st.pop(); } else if(x == '+'){ ret += (sign * num); sign = 1; num = 0; } else if(x == '-'){ ret += (sign * num); sign = -1; num = 0; } } if(num){ ret += sign * num; } return ret; } }; main(){ Solution ob; cout << (ob.calculate("5 + 2 - 3")); }
ইনপুট
"5 + 2 - 3"
আউটপুট
4