मान लीजिए कि हमारे पास एक अभिव्यक्ति है जो त्रिगुट अभिव्यक्ति रखती है, हमें अभिव्यक्ति के परिणाम का मूल्यांकन करना होगा। यह सही और गलत के लिए टी और एफ जैसे कुछ मूल्यों का समर्थन करता है और "?" और ":" अक्षर। कुछ गुण हैं:
- दिए गए स्ट्रिंग की लंबाई 10000 से कम या उसके बराबर होनी चाहिए।
- सशर्त अभिव्यक्ति समूह दाएं से बाएं।
- शर्त हमेशा टी या एफ होगी। इसलिए शर्त कभी भी अंक नहीं होगी।
- व्यंजक का परिणाम हमेशा T या F का मूल्यांकन करेगा।
तो उदाहरण के लिए, यदि इनपुट "टी" जैसा है? टी ? एफ:टी:टी", तो आउटपुट एफ होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
- ret:=एक खाली स्ट्रिंग, n:=s का आकार,
- स्टैक सेंट बनाएं
- मैं श्रेणी n - 1 से 0 तक के लिए
- x :=s[i]
- यदि st खाली नहीं है और स्टैक का शीर्ष '?' है, तो
- सेंट से हटाएं
- पहले :=सेंट के ऊपर, फिर स्टैक से दो तत्वों को हटा दें
- दूसरा:=स्टैक के ऊपर, और सेंट से हटाएं
- यदि x, T है, तो पहले st में डालें, अन्यथा st में दूसरा डालें
- अन्यथा x को सेंट में डालें
- जब तक सेंट खाली नहीं है, तब
- 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