Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

पायथन में स्ट्रिंग से बूलियन अभिव्यक्ति का मूल्यांकन करने का प्रोग्राम

एक स्ट्रिंग s दी गई है जिसमें बूलियन अभिव्यक्ति है जिसमें ऑपरेटर "and" और "or" हैं, और कोष्ठक हो सकते हैं। अभिव्यक्ति का मूल्यांकन करके परिणाम वापस करें।

उदाहरण

इनपुट: s = "T and (F or T)"

आउटपुट: True

एल्गोरिदम (स्टैक आधारित पार्सिंग)

  1. एक स्टैक stack बनाएं।
  2. स्ट्रिंग को स्पेस से विभाजित करके टोकन प्राप्त करें।
  3. प्रत्येक टोकन v के लिए:
    • यदि v '(' से शुरू होता है: खोलने वाले कोष्ठक की संख्या गिनें, आंतरिक मान ("T" या "F") को बूलियन में बदलकर स्टैक पर पुश करें।
    • यदि v में ')' है: बंद कोष्ठक की संख्या ct गिनें। आंतरिक मान को बूलियन में बदलकर पुश करें। फिर ct बार: दायां ऑपरेंड पॉप करें, ऑपरेटर पॉप करें, बायां ऑपरेंड पॉप करें, ऑपरेशन लागू करें, परिणाम पुश करें।
    • यदि v "T" या "F" है: संबंधित बूलियन पुश करें।
    • अन्यथा (ऑपरेटर "and"/"or"): संबंधित लैम्ब्डा फंक्शन पुश करें।
  4. अंत में, यदि स्टैक में एक से अधिक तत्व हैं, तो बाएं से दाएं मूल्यांकन करें (क्योंकि सभी ऑपरेटर समान प्राथमिकता के हैं और बाएं-संयोजक हैं)।
  5. स्टैक का शीर्ष तत्व वापस करें।

पायथन कार्यान्वयन

class Solution:
    def solve(self, s):
        stack = []
        op = {
            "or": lambda x, y: x or y,
            "and": lambda x, y: x and y,
        }
        for v in s.split():
            if v[0] == "(":
                # खोलने वाले कोष्ठक छोड़कर मान लें
                stack.append(v[v.count("("):] == "T")
            elif v.count(")") > 0:
                ct = v.count(")")
                # बंद कोष्ठक छोड़कर मान लें
                stack.append(v[:-ct] == "T")
                for _ in range(ct):
                    right = stack.pop()
                    o = stack.pop()
                    left = stack.pop()
                    stack.append(o(left, right))
            elif v in ["T", "F"]:
                stack.append(v == "T")
            else:
                stack.append(op[v])
        
        # शेष स्टैक का मूल्यांकन (बाएं से दाएं)
        if len(stack) > 1:
            for i in range(0, len(stack) - 1, 2):
                stack[i + 2] = stack[i + 1](stack[i], stack[i + 2])
            return stack[-1]
        return stack[0]

# परीक्षण
ob = Solution()
print(ob.solve("T and (F or T)"))        # True
print(ob.solve("F or T and F"))          # False
print(ob.solve("(T or F) and (F or T)")) # True

समय जटिलता

  • O(n) जहां n टोकन की संख्या है।
  • स्थान: O(n) स्टैक के लिए।

नोट

यह कार्यान्वयन मानता है कि इनपुट वैध है और ऑपरेटर "and", "or" और कोष्ठक सही ढंग से संतुलित हैं। "and" और "or" की समान प्राथमिकता मानी गई है (बाएं-संयोजक)।

  1. पायथन प्रोग्राम: स्ट्रिंग से nth कैरेक्टर हटाएं पायथन प्रोग्राम: स्ट्रिंग से nth कैरेक्टर हटाएं

    इस लेख में, हम नीचे दिए गए प्रॉब्लम स्टेटमेंट के समाधान के बारे में सीखेंगे: प्रॉब्लम स्टेटमेंट हमें एक स्ट्रिंग दी गई है, हमें दी गई स्ट्रिंग से i-वें इंडेक्स वाले कैरेक्टर को हटाना है और इसे प्रदर्शित करना है। पायथन में किसी भी स्ट्रिंग में, इंडेक्सिंग हमेशा 0 से शुरू होती है। मान लीजिए हमारे पा

  1. पायथन प्रोग्राम: स्ट्रिंग से nth कैरेक्टर हटाना पायथन प्रोग्राम: स्ट्रिंग से nth कैरेक्टर हटाना

    इस लेख में, हम नीचे दिए गए समस्या कथन के समाधान के बारे में जानेंगे -समस्या कथन - हमें एक स्ट्रिंग दी गई है, हमें दी गई स्ट्रिंग से ith इंडेक्स वाले कैरेक्टर को हटाना है और इसे प्रदर्शित करना है।पायथन में किसी भी स्ट्रिंग में, इंडेक्सिंग हमेशा 0 से शुरू होती है। मान लीजिए हमारे पास एक स्ट्रिंग tutor

  1. पायथन प्रोग्राम: स्ट्रिंग से n-वां कैरेक्टर हटाना पायथन प्रोग्राम: स्ट्रिंग से n-वां कैरेक्टर हटाना

    स्ट्रिंग का अर्थ है कैरेक्टर्स का ऐरे, इसलिए शुरुआती एड्रेस 0 होता है। फिर हम आसानी से हर कैरेक्टर का इंडेक्स प्राप्त कर सकते हैं। हमें वह इंडेक्स नंबर इनपुट करना होता है फिर उस एलिमेंट को हटाना होता है। इसलिए स्ट्रिंग को दो सबस्ट्रिंग्स में स्प्लिट करें। दो भाग होने चाहिए: एक n-वें इंडेक्स्ड कैरेक्