学习笔记-栈的简单应用(Python)

    用栈来实现简单的括号匹配问题。主要包含圆括号、方括号和花括号。

    当前闭括号应该与前面最近的尚未配对的开括号进行匹配,下一个闭括号应该与前面次近的括号进行匹配。这恰恰符合后进先出的的原则。如果一个开括号已经匹配,则将其删除,为随后的匹配做准备。

class StackUnderflow(ValueError):
    pass


class SStack():
    def __init__(self):
        self.elems = []

    def is_empty(self):
        return self.elems == []

    def top(self):
        if self.elems == []:
            raise StackUnderflow('in SStack.top()')
        return self.elems[-1]

    def push(self, elem):
        self.elems.append(elem)

    def pop1(self):
        if self.elems == []:
            raise StackUnderflow('in SStack.pop()')
        return self.elems.pop()


def check_parens(text):
    """  
    括号匹配检查函数 
    """
    parens = '()[]{}'  # 所有括号字符
    open_parens = '([{'  # 开括号字符
    opposite = {')': '(', ']': '[', '}': '{'}  # 表示配对关系的字典

    def parentheses(text):
        """  
        括号生成器 
        """
        i, text_len = 0, len(text)
        while True:
            while i < text_len and text[i] not in parens:
                i += 1  # 如果不是括号字符,直接pass             if i >= text_len:
                return
            yield text[i], i
            i += 1

    s = SStack()
    for pr, i in parentheses(text):  # text中个括号和位置进行迭代 
        if pr in open_parens:  # 开括号,压进栈并继续
            s.push(pr)
        elif s.pop1() != opposite[pr]:  # 不匹配则退出
            print('Unmatching is found at', i, 'for', pr)
           return False

    print('All parentheses are correctly matched.')
    return True


if __name__ == '__main__':
    text = '(dog] cat '
    check_parens(text)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值