ধরুন আমাদের একটি অভিব্যক্তি আছে যা ত্রিমাত্রিক রাশি ধারণ করে, আমাদের অভিব্যক্তিটির ফলাফল মূল্যায়ন করতে হবে। এটি সত্য এবং মিথ্যার জন্য T এবং F এর মত কিছু মান সমর্থন করে এবং "?" এবং ":" অক্ষর। কিছু বৈশিষ্ট্য আছে:
- প্রদত্ত স্ট্রিংটির দৈর্ঘ্য অবশ্যই 10000 এর কম বা সমান হতে হবে।
- কন্ডিশনাল এক্সপ্রেশন ডান-থেকে-বামে গ্রুপ।
- শর্তটি সর্বদা T বা F হবে। তাই শর্তটি কখনই একটি অঙ্ক হবে না।
- অভিব্যক্তির ফলাফল সর্বদা T বা F তে মূল্যায়ন করা হবে।
সুতরাং উদাহরণস্বরূপ, যদি ইনপুটটি "T? টি? F :T :T", তাই আউটপুট হবে F.
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব:
- ret :=একটি খালি স্ট্রিং, n :=s এর আকার,
- একটি স্ট্যাক স্ট্যাক তৈরি করুন
- আমি n – 1 থেকে 0
- রেঞ্জে
- x :=s[i]
- যদি st খালি না হয় এবং স্ট্যাকের উপরের '?' হয়, তাহলে
- st থেকে মুছুন
- প্রথম :=st এর শীর্ষ, তারপর স্ট্যাক থেকে দুটি উপাদান মুছে দিন
- সেকেন্ড :=স্ট্যাকের শীর্ষ, এবং st থেকে মুছে দিন
- যদি x টি হয়, তাহলে প্রথমে st-এ ঢোকান, অন্যথায় st-এ দ্বিতীয় ঢোকান
- অন্যথায় st-এ x ঢোকান
- যখন st খালি নয়, তারপর
- ret :=ret + st এর শীর্ষ এবং st থেকে মুছে দিন
- রিভার্স রেট এবং রিটার্ন রিটার্ন
আরও ভালভাবে বোঝার জন্য আসুন নিম্নলিখিত বাস্তবায়ন দেখি:
উদাহরণ
#include
using namespace std;
class Solution {
public:
string parseTernary(string s) {
string ret = "";
int n = s.size();
stack st;
for(int i = n - 1; i >= 0; i--){
char x = s[i];
if(!st.empty() && st.top() == '?'){
st.pop();
char first = st.top();
st.pop();
st.pop();
char second = st.top();
st.pop();
if(x == 'T'){
st.push(first);
}
else st.push(second);
}
else{
st.push(x);
}
}
while(!st.empty()){
ret += st.top();
st.pop();
}
reverse(ret.begin(), ret.end());
return ret;
}
};
main(){
Solution ob;
cout << (ob.parseTernary("T?T?F:T:T"));
} ইনপুট
" T?T?F:T:T"
আউটপুট
F