DSA Interview Prep · पाठ

स्टैक का कार्यान्वयन और उपयोग

push/pop/peek के साथ स्टैक लागू कीजिए, फिर valid-parentheses, min-stack और reverse-polish notation का मूल्यांकन हल कीजिए।

पाठ 1, कुल 4 में से13 चरण

स्टैक का कार्यान्वयन और उपयोग, CoddyKit पर DSA Interview Prep का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह DSA Interview Prep सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। DSA Interview Prep पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

स्टैक डेटा संरचना

स्टैक लास्ट-इन, फर्स्ट-आउट (LIFO) डेटा संरचना है। इसमें सबसे अंत में push किया गया तत्व सबसे पहले pop होता है। इसे प्लेटों के ढेर की तरह समझिए: आप केवल ऊपर से ही जोड़ या हटा सकते हैं। मुख्य संक्रियाएँ हैं push (ऊपर जोड़ना), pop (ऊपर से हटाना) और peek (हटाए बिना ऊपर का तत्व पढ़ना)। अच्छी तरह लागू किए गए स्टैक में ये तीनों O(1) होती हैं।

पाइथन में सूची एक आदर्श स्टैक का काम करती है: append push है, pop() pop है और [-1] peek है।

stack = []

# Push
stack.append(10)
stack.append(20)
stack.append(30)
print('After pushes:', stack)  # [10, 20, 30]

# Peek
print('Top:', stack[-1])       # 30

# Pop
print('Popped:', stack.pop())  # 30
print('After pop:', stack)     # [10, 20]

push, pop, peek और isEmpty वाली Stack क्लास

सूची को एक क्लास में लपेटने से इंटरफ़ेस अधिक साफ़ मिलता है और insert जैसी गैर-स्टैक संक्रियाओं या शीर्ष के अलावा किसी अन्य स्थिति पर अनुक्रमण के आकस्मिक उपयोग को रोका जा सकता है। जब आपसे ‘शुरू से स्टैक लागू करने’ को कहा जाता है, तो साक्षात्कारकर्ता इसी तरह के कार्यान्वयन की अपेक्षा करते हैं।

class Stack:
    def __init__(self):
        self._data = []

    def push(self, val):
        self._data.append(val)

    def pop(self):
        if self.is_empty():
            raise IndexError('pop from empty stack')
        return self._data.pop()

    def peek(self):
        if self.is_empty():
            raise IndexError('peek at empty stack')
        return self._data[-1]

    def is_empty(self):
        return len(self._data) == 0

    def __len__(self):
        return len(self._data)

s = Stack()
s.push(1); s.push(2); s.push(3)
print(s.peek())  # 3
print(s.pop())   # 3
print(len(s))    # 2

मान्य कोष्ठक (LeetCode 20)

LeetCode 20 ‘मान्य कोष्ठक’: यह निर्धारित कीजिए कि कोष्ठकों की कोई स्ट्रिंग संतुलित है या नहीं। हर खुले कोष्ठक को push कीजिए। हर बंद कोष्ठक के लिए जाँचिए कि स्टैक का शीर्ष उससे मेल खाने वाला उद्घाटक है; यदि ऐसा न हो या स्टैक खाली हो, तो असत्य लौटाइए। अंत में यदि स्टैक खाली है, तो स्ट्रिंग मान्य है। कोडिंग साक्षात्कारों में यह स्टैक का सबसे मानक पहला उपयोग है।

def isValid(s):
    stack = []
    matching = {')': '(', '}': '{', ']': '['}
    for ch in s:
        if ch in '([{':
            stack.append(ch)
        else:
            if not stack or stack[-1] != matching[ch]:
                return False
            stack.pop()
    return len(stack) == 0

print(isValid('()[]{}'))    # True
print(isValid('([)]'))      # False
print(isValid('{[]}'))      # True
print(isValid(']'))         # False

न्यूनतम स्टैक (LeetCode 155)

LeetCode 155 ‘न्यूनतम स्टैक’: ऐसा स्टैक तैयार कीजिए जो push, pop, peek और getMin सभी को O(1) समय में समर्थित करे। तरकीब यह है कि एक दूसरा स्टैक बनाए रखा जाए, जो हर स्थिति पर न्यूनतम मान को ट्रैक करे। push करते समय नए मान को न्यूनतम-स्टैक में भी push कीजिए, यदि वह वर्तमान न्यूनतम से <= हो या न्यूनतम-स्टैक खाली हो। pop करते समय, यदि हटाया गया मान वर्तमान न्यूनतम के बराबर हो, तो न्यूनतम-स्टैक से भी pop कीजिए।

class MinStack:
    def __init__(self):
        self.stack = []
        self.min_stack = []

    def push(self, val):
        self.stack.append(val)
        if not self.min_stack or val <= self.min_stack[-1]:
            self.min_stack.append(val)

    def pop(self):
        val = self.stack.pop()
        if val == self.min_stack[-1]:
            self.min_stack.pop()
        return val

    def top(self):
        return self.stack[-1]

    def getMin(self):
        return self.min_stack[-1]

ms = MinStack()
ms.push(-2); ms.push(0); ms.push(-3)
print(ms.getMin())  # -3
ms.pop()
print(ms.top())     # 0
print(ms.getMin())  # -2

रिवर्स पोलिश नोटेशन का मूल्यांकन

LeetCode 150 ‘रिवर्स पोलिश नोटेशन का मूल्यांकन’ (पोस्टफिक्स): ऑपरैंड को push किया जाता है; किसी ऑपरेटर पर पहुँचने पर दो ऑपरैंड को pop करके ऑपरेशन लागू किया जाता है और परिणाम को push किया जाता है। घटाव और भाग के लिए क्रम महत्वपूर्ण है: सबसे पहले pop किया गया ऑपरैंड दायाँ ऑपरैंड होता है और दूसरा बायाँ।

def evalRPN(tokens):
    stack = []
    ops = set(['+', '-', '*', '/'])
    for tok in tokens:
        if tok not in ops:
            stack.append(int(tok))
        else:
            b = stack.pop()  # right operand
            a = stack.pop()  # left operand
            if tok == '+':
                stack.append(a + b)
            elif tok == '-':
                stack.append(a - b)
            elif tok == '*':
                stack.append(a * b)
            else:             # division truncated toward zero
                stack.append(int(a / b))
    return stack[0]

print(evalRPN(['2','1','+','3','*']))     # 9
print(evalRPN(['4','13','5','/','+']))    # 6
print(evalRPN(['10','6','9','3','+','-11','*','/','*','17','+','5','+']))  # 22

स्ट्रिंग को डिकोड करना (LeetCode 394)

LeetCode 394 ‘स्ट्रिंग को डिकोड करना’: 3[a2[c]] जैसी एनकोड की गई स्ट्रिंग को accaccacc में विस्तारित कीजिए। दो स्टैक का उपयोग कीजिए: एक दोहराव की संख्याओं के लिए और दूसरा संचित स्ट्रिंग के लिए। किसी अंक पर पहुँचने पर पूरी संख्या बनाइए। [ पर वर्तमान स्ट्रिंग और संख्या को push कीजिए। ] पर उन्हें pop करके वर्तमान खंड को दोहराइए। किसी अक्षर पर उसे वर्तमान स्ट्रिंग में जोड़ दीजिए।

def decodeString(s):
    count_stack = []
    str_stack   = []
    current_str = ''
    current_num = 0
    for ch in s:
        if ch.isdigit():
            current_num = current_num * 10 + int(ch)
        elif ch == '[':
            count_stack.append(current_num)
            str_stack.append(current_str)
            current_str = ''
            current_num = 0
        elif ch == ']':
            repeats = count_stack.pop()
            current_str = str_stack.pop() + current_str * repeats
        else:
            current_str += ch
    return current_str

print(decodeString('3[a]2[bc]'))    # 'aaabcbc'
print(decodeString('3[a2[c]]'))     # 'accaccacc'
print(decodeString('2[abc]3[cd]ef')) # 'abcabccdcdcdef'

दैनिक तापमान (एकरस स्टैक का पूर्वावलोकन)

LeetCode 739 ‘दैनिक तापमान’: हर दिन के लिए पता लगाइए कि अधिक गर्म तापमान आने में कितने दिन लगेंगे। सीधा तरीका O(n²) का है। स्टैक के साथ तापमानों पर क्रम से चलिए; हर दिन उन सभी स्टैक प्रविष्टियों (दिन के सूचकांकों) को pop कीजिए जिनका तापमान आज के तापमान से कम है। उन हटाए गए दिनों का उत्तर (आज का दिन - हटाया गया दिन) होगा। वर्तमान दिन को push कीजिए। स्टैक में बची प्रविष्टियों को कभी अधिक गर्म दिन नहीं मिला, इसलिए उनका उत्तर 0 है।

def dailyTemperatures(temps):
    result = [0] * len(temps)
    stack  = []  # stores indices
    for i, t in enumerate(temps):
        while stack and temps[stack[-1]] < t:
            j = stack.pop()
            result[j] = i - j
        stack.append(i)
    return result

print(dailyTemperatures([73,74,75,71,69,72,76,73]))
# [1, 1, 4, 2, 1, 1, 0, 0]

DFS भ्रमण के लिए स्टैक

पुनरावर्ती DFS में प्रयुक्त कॉल स्टैक को एक स्पष्ट स्टैक से बदला जा सकता है, जिससे एल्गोरिदम पुनरावृत्तिमूलक बन जाता है। रूट को push कीजिए; जब तक स्टैक खाली न हो, एक नोड को pop करके उसका प्रसंस्करण कीजिए और उसके बच्चों को push कीजिए (बाएँ से दाएँ प्रसंस्करण के लिए पहले दाएँ, फिर बाएँ)। यह पुनरावृत्तिमूलक DFS व्यवहार में पुनरावर्ती DFS जैसा ही है, लेकिन गहरे ट्री के लिए पाइथन की पुनरावर्तन सीमा से बचाता है।

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val   = val
        self.left  = left
        self.right = right

def preorder_iterative(root):
    if not root:
        return []
    result, stack = [], [root]
    while stack:
        node = stack.pop()
        result.append(node.val)
        if node.right:
            stack.append(node.right)  # push right first
        if node.left:
            stack.append(node.left)   # so left is processed first
    return result

root = TreeNode(1, TreeNode(2, TreeNode(4), TreeNode(5)), TreeNode(3))
print(preorder_iterative(root))  # [1, 2, 4, 5, 3]

समय और स्थान की जटिलता

स्टैक की सभी संक्रियाएँ (push, pop, peek, isEmpty) O(1) परिशोधित होती हैं। n तत्वों का स्टैक बनाना O(n) है। सबसे खराब स्थिति में स्थान O(n) होता है, जब सभी तत्व संग्रहीत हों। एकरस स्टैक वाली समस्याओं में प्रत्येक तत्व को अधिकतम एक बार push और एक बार pop किया जाता है, इसलिए सभी पुनरावृत्तियों में कुल O(n) समय लगता है — सरल बाहरी-लूप वाले विश्लेषण से प्रतीत होने वाले O(n²) के बजाय।

# Demonstrate O(n) total for monotonic stack
# Each element pushed once, popped at most once => 2n operations total

def count_ops(n):
    pushes = pops = 0
    stack = []
    for i in range(n):
        while stack and stack[-1] < i:  # simulated decreasing condition
            stack.pop()
            pops += 1
        stack.append(i)
        pushes += 1
    return pushes, pops

p, pp = count_ops(1000)
print(f'Pushes: {p}, Pops: {pp}, Total ops: {p+pp}')  # <= 2000

हिस्टोग्राम में सबसे बड़ा आयत (पूर्वावलोकन)

LeetCode 84 ‘हिस्टोग्राम में सबसे बड़ा आयत’ स्टैक की सबसे कठिन प्रसिद्ध समस्या है। प्रत्येक पट्टी के लिए, वह आयत बाईं ओर तब तक फैल सकता है जब तक उससे छोटी पट्टी न मिल जाए और दाईं ओर भी तब तक फैल सकता है जब तक उससे छोटी पट्टी न मिल जाए। एकरस स्टैक बढ़ती हुई ऊँचाई के क्रम में पट्टियों के सूचकांकों को ट्रैक करता है। जब छोटी पट्टी दिखाई दे, तो pop कीजिए और हटाई गई पट्टी की ऊँचाई से आयत की गणना कीजिए। स्टैक प्रत्येक pop के लिए O(1) समय में बाएँ और दाएँ सीमाएँ देता है।

def largestRectangleArea(heights):
    stack  = []  # indices, increasing heights
    result = 0
    heights = heights + [0]  # sentinel forces all pops
    for i, h in enumerate(heights):
        while stack and heights[stack[-1]] > h:
            height = heights[stack.pop()]
            width  = i if not stack else i - stack[-1] - 1
            result = max(result, height * width)
        stack.append(i)
    return result

print(largestRectangleArea([2,1,5,6,2,3]))  # 10
print(largestRectangleArea([2,4]))           # 4

स्टैक समस्याओं के लिए साक्षात्कार रणनीति

स्टैक समस्याएँ अक्सर अपने आपको ‘अंदर से बाहर की ओर प्रसंस्करण’ या ‘अगला बड़ा/छोटा तत्व ढूँढना’ के रूप में छिपाती हैं। ये संकेत बताते हैं कि स्टैक उपयोगी हो सकता है: आपको सबसे हाल में देखे गए तत्व की आवश्यकता है, आप जोड़ों का मिलान कर रहे हैं (कोष्ठक, टैग), या आप ऐसी समस्या पर O(n) चाहते हैं जिसमें सरल तरीके से O(n²) के नेस्टेड लूप लगते हों। विशेष रूप से एकरस स्टैक ‘हर तत्व के लिए सबसे निकट का बड़ा/छोटा तत्व ढूँढने’ की समस्या को O(n²) से O(n) में बदल देते हैं।

साक्षात्कार में अपने स्टैक का अपरिवर्तनीय नियम स्पष्ट रूप से बताइए: ‘मैं घटती हुई ऊँचाई के क्रम में सूचकांकों का स्टैक बनाए रखूँगा।’

त्वरित जाँच

इस पाठ में सिखाई गई डेटा संरचनाओं और एल्गोरिदम — कोडिंग साक्षात्कार की तैयारी — की अवधारणाओं की अपनी समझ जाँचिए।

पाठ का पुनरावलोकन

इस पाठ में आपने सीखा: पाइथन की सूचियाँ O(1) push/pop/peek लागू करती हैं, इसलिए वे आदर्श स्टैक हैं; मान्य कोष्ठक और न्यूनतम स्टैक, स्टैक से जुड़ी दो मानक साक्षात्कार समस्याएँ हैं; और एकरस स्टैक प्रत्येक तत्व को अधिकतम एक बार push और pop करके O(n) में अगले बड़े तत्व वाली समस्याएँ हल करते हैं। आगे हम पाइथन के डेक से कतार बनाएँगे और स्लाइडिंग-विंडो का अधिकतम मान निकालेंगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
30
पाठ
120

अक्सर पूछे जाने वाले प्रश्न

क्या “स्टैक का कार्यान्वयन और उपयोग” पाठ निःशुल्क है?

हाँ — DSA Interview Prep अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “स्टैक का कार्यान्वयन और उपयोग” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। DSA Interview Prep पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“स्टैक का कार्यान्वयन और उपयोग” में मैं क्या सीखूँगा?

push/pop/peek के साथ स्टैक लागू कीजिए, फिर valid-parentheses, min-stack और reverse-polish notation का मूल्यांकन हल कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ DSA Interview Prep का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या DSA Interview Prep शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर DSA Interview Prep शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“स्टैक का कार्यान्वयन और उपयोग” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस DSA Interview Prep पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर DSA Interview Prep पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. स्टैक का कार्यान्वयन और उपयोग
  2. क्यू का कार्यान्वयन और Deque
  3. Monotonic Stack पैटर्न
  4. स्टैक और क्यू का पारस्परिक अनुकरण
← DSA Interview Prep पर वापस जाएँ