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