zoukankan      html  css  js  c++  java
  • 05.栈、栈的简单应用--括号匹配问题

    class StackUnderflow(ValueError):
        """空栈访问"""
        pass
    
    
    class SStack:
        """
        基于顺序表实现栈类
        最后一个为栈顶
        """
    
        def __init__(self):
            self._elems = []
    
        def is_empty(self):
            return self._elems == []
    
        def top(self):
            if self.is_empty():
                raise StackUnderflow("in SStack.top()")
            return self._elems[-1]
    
        def push(self, elem):
            self._elems.append(elem)
    
        def pop(self):
            if self.is_empty():
                raise StackUnderflow("in SStack.pop()")
            return self._elems.pop()
    
        def print(self):
            print(self._elems[::-1])
    
    
    class LNode:
        """链表节点"""
    
        def __init__(self, elem, next_=None):
            self.elem = elem
            self.next = next_
    
    
    class LStack:
        """
        基于链表实现的栈类,表头端为栈顶,用LNode作结点
        """
    
        def __init__(self):
            self._top = None
    
        def is_empty(self):
            return self._top is None
    
        def top(self):
            if self.is_empty():
                raise StackUnderflow("in LStack.top()")
            return self._top.elem
    
        def push(self, elem):
            self._top = LNode(elem, self._top)
    
        def pop(self):
            if self.is_empty():
                raise StackUnderflow("in LStack.pop()")
            p = self._top
            self._top = p.next
            return p.elem
    
        def print(self):
            p = self._top
            print('[', end='')
            while p is not None:
                print(p.elem, end=',') if (p.next is not None) else print(p.elem, end='')
                p = p.next
            print(']', end='')
            print()
    
    
    if __name__ == '__main__':
        st1 = SStack()
        st1.push(1)
        st1.push(2)
        st1.print()
        if not st1.is_empty():
            print(st1.top())
        print(st1.pop())
        if not st1.is_empty():
            print(st1.top())
        print("-------------")
        lst1 = LStack()
        lst1.push(1)
        lst1.push(2)
        lst1.print()
        if not lst1.is_empty():
            print(lst1.top())
        print(lst1.pop())
        if not lst1.is_empty():
            print(lst1.top())

     括号匹配问题:

    def check_parents(text):
        """括号配对检查函数,text为被检查的正文串"""
        parent = "()[]{}"  # 所有括号
        open_parents = "([{"  # 开括号字符
        opposite = {")": "(", "]": "[", "}": "{"}  # 配对关系字典
    
        def parentheses(text):
            """
            括号生成器
            返回text里的下一括号及其位置
            """
            i, text_len = 0, len(text)
            while 1:
                while i < text_len and text[i] not in parent:
                    i += 1
                if i >= text_len:
                    return
                yield text[i], i  # 每次执行到yield产生出下一个值
                i += 1
        st = SStack()
        for pr, i in parentheses(text):
            if pr in open_parents:
                st.push(pr)
            elif st.pop() != opposite[pr]:
                print("Unmatching is found at", i, "for", pr)
                return False
        print("All parentheses are correctly matched.")
        return True
    
    
    if __name__ == '__main__':
        print(check_parents("(123)"))
        print(check_parents("(123]"))
        # All parentheses are correctly matched.
        # True
        # Unmatching is found at 4 for ]
        # False
  • 相关阅读:
    自动化无线网破解工具wifite2
    用Python实现Excel的读写
    Python常见问题系列
    集群搭建
    redis进阶
    android中实现简单的聊天功能
    android中使用setOnKeyListener响应输入事件
    android中使用spinner组件,以key,value的方式
    android中使用spinner组件
    android中使用Nine-Patch图片
  • 原文地址:https://www.cnblogs.com/fly-book/p/11713971.html
Copyright © 2011-2022 走看看