কম্পিউটার

C++ এ টারনারি এক্সপ্রেশন পার্সার


ধরুন আমাদের কাছে একটি স্ট্রিং আছে যা ইচ্ছামত নেস্টেড টারনারি এক্সপ্রেশনের প্রতিনিধিত্ব করে, আমাদের এক্সপ্রেশনের ফলাফল গণনা করতে হবে। আমরা সর্বদা ধরে নিতে পারি যে প্রদত্ত অভিব্যক্তিটি বৈধ এবং শুধুমাত্র 0-9, ?, :, T এবং F এই কয়েকটি অক্ষর নিয়ে গঠিত। (এখানে T এবং F যথাক্রমে True এবং False প্রতিনিধিত্ব করে)। কিছু বৈশিষ্ট্য আছে -

  • প্রদত্ত স্ট্রিং এর দৈর্ঘ্য 10000 এর কম বা সমান হতে হবে।

  • প্রতিটি সংখ্যায় শুধুমাত্র একটি সংখ্যা থাকবে।

  • কন্ডিশনাল এক্সপ্রেশন ডান-থেকে-বামে গ্রুপ।

  • শর্তটি সর্বদা T বা F হবে। তাই শর্তটি কখনই একটি অঙ্ক হবে না।

  • অভিব্যক্তির ফলাফল সর্বদা 0-9, T বা F সংখ্যায় মূল্যায়ন করবে।

সুতরাং উদাহরণস্বরূপ, যদি ইনপুটটি "F?1:T?4:5" এর মত হয়, তাহলে আউটপুট হবে 4, কারণ এটি ডানদিকের অভিব্যক্তি "T?4:5" পার্স করবে, এটি 4 প্রদান করবে, তারপর প্রধান অভিব্যক্তি হবে “F?1:4”, তাই প্রত্যাবর্তিত মান হল 4।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • ret :=একটি খালি স্ট্রিং, n :=s এর আকার, একটি স্ট্যাক স্ট্যাক তৈরি করুন

  • I রেঞ্জ n – 1 থেকে 0

    এর মধ্যে
    • x :=s[i]

    • যদি st খালি না হয় এবং স্ট্যাকের উপরের '?' হয়, তাহলে

      • st

        থেকে মুছুন
      • প্রথমে :=st এর শীর্ষ, তারপর স্ট্যাক থেকে দুটি উপাদান মুছে দিন

      • দ্বিতীয় :=স্ট্যাকের উপরে, এবং st

        থেকে মুছে দিন
      • যদি x টি হয়, তাহলে প্রথমে st-এ ঢোকান, অন্যথায় st-এ দ্বিতীয় ঢোকান

    • অন্যথায়, st

      -এ x ঢোকান
  • যখন st খালি নয়, তারপর

    • ret :=ret + st এর শীর্ষ এবং st থেকে মুছুন

  • রিভার্স রেট এবং রিটার্ন রিটার্ন

উদাহরণ (C++)

আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   string parseTernary(string s) {
      string ret = "";
      int n = s.size();
      stack <char> 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("F?1:T?4:5"));
}

ইনপুট

"F?1:T?4:5"

আউটপুট

4

  1. C/C++ এ দাবী

  2. C++ একটি অভিব্যক্তি থেকে অবৈধ বন্ধনী সরান

  3. C++ এ উদাহরণ সহ এক্সপ্রেশন ট্রি

  4. C++ এ এক্সপ্রেশন ট্রির মূল্যায়ন