Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में टर्नरी एक्सप्रेशन पार्सर


मान लीजिए कि हमारे पास एक स्ट्रिंग है जो मनमाने ढंग से नेस्टेड टर्नरी एक्सप्रेशन का प्रतिनिधित्व करती है, हमें एक्सप्रेशन के परिणाम की गणना करनी होगी। हम हमेशा यह मान सकते हैं कि दिया गया व्यंजक वैध है और इसमें केवल 0-9, ?, :, T और F ये कुछ वर्ण हैं। (यहाँ T और F क्रमशः सत्य और असत्य का प्रतिनिधित्व करते हैं)। कुछ गुण हैं -

  • दी गई स्ट्रिंग की लंबाई 10000 से कम या उसके बराबर होनी चाहिए।

  • प्रत्येक संख्या में केवल एक अंक होगा।

  • सशर्त अभिव्यक्ति समूह दाएं से बाएं।

  • कंडीशन हमेशा या तो T या F होगी। इसलिए कंडीशन कभी भी डिजिट नहीं होगी।

  • व्यंजक का परिणाम हमेशा 0-9 अंक, T या F में से किसी एक का मूल्यांकन करेगा।

तो उदाहरण के लिए, यदि इनपुट "एफ? 1:टी? 4:5" जैसा है, तो आउटपुट 4 होगा, क्योंकि यह सबसे सही अभिव्यक्ति "टी? 4:5" को पार्स करेगा, यह 4 लौटाएगा, फिर मुख्य अभिव्यक्ति "F?1:4" होगी, इसलिए लौटाया गया मान 4 है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • ret :=एक खाली स्ट्रिंग, n :=s का आकार, एक स्टैक st बनाएं

  • मैं के लिए n - 1 से 0 तक की श्रेणी में हूं

    • एक्स:=एस [i]

    • यदि सेंट खाली नहीं है और स्टैक का शीर्ष '?' है, तो

      • सेंट से हटाएं

      • पहले:=सेंट के ऊपर, फिर स्टैक से दो तत्वों को हटा दें

      • दूसरा:=स्टैक के ऊपर, और सेंट से हटाएं

      • यदि x, T है, तो पहले st में डालें, अन्यथा st में दूसरा डालें

    • अन्यथा, x को सेंट में डालें

  • जबकि सेंट खाली नहीं है, तब

    • रिट :=रिट + सेंट के ऊपर और सेंट से हटाएं

  • रिवर्स रिट और रिटर्न रिट

उदाहरण (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. सी ++ एक अभिव्यक्ति से अमान्य कोष्ठक निकालें

    एक कोष्ठक अनुक्रम को देखते हुए; अब, आपको उन सभी संभावित कोष्ठकों को प्रिंट करना होगा, जिन्हें वह अमान्य कोष्ठकों को हटाकर बना सकता है, उदाहरण के लिए Input : str = “()())()” - Output : ()()() (())() There are two possible solutions "()()()" and "(())()" Input : str =

  1. सी ++ में उदाहरण के साथ अभिव्यक्ति वृक्ष

    एक्सप्रेशन ट्री एक विशेष प्रकार का बाइनरी ट्री होता है जिसमें ट्री के प्रत्येक नोड में या तो एक ऑपरेटर या ऑपरेंड होता है। लीफ नोड्स पेड़ का एक संचालन . का प्रतिनिधित्व करता है . गैर-पत्ती नोड्स पेड़ का एक ऑपरेटर . का प्रतिनिधित्व करता है । उदाहरण: इंफिक्स एक्सप्रेशन प्राप्त करने के लिए जिस

  1. सी++ में एक्सप्रेशन ट्री का मूल्यांकन

    इस समस्या में, हमें एक एक्सप्रेशन ट्री दिया जाता है जिसमें बाइनरी ऑपरेशंस जैसे +, -, /, * होते हैं। हमें एक्सप्रेशन ट्री का मूल्यांकन करने और फिर परिणाम वापस करने की आवश्यकता है। अभिव्यक्ति वृक्ष एक विशेष प्रकार का बाइनरी ट्री है जिसमें प्रत्येक नोड में या तो एक ऑपरेटर या ऑपरेंड होता है जो इस प्रक