【Python】利用栈实现括号匹配

该文章介绍了如何使用Python自定义栈类MyStack来检查字符串中的括号匹配。par_math函数通过遍历输入字符串并利用栈的数据结构,遇到左括号时入栈,遇到右括号时检查栈顶元素是否与其匹配。如果匹配则出栈,否则返回False。最终栈为空且所有括号匹配则返回True。示例中给定的字符串([{])的匹配结果为False。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【Python】利用栈实现字符串括号匹配

1. MyStack.py

class MyStack():

    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[len(self.items)-1]

    def size(self):
        return len(self.items)

    def __str__(self):
        return f'{self.items}'
        

2. par_match.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/7/14 21:53
# @Author  : Sophia
# @File    : csdn_match.py
# @Software: PyCharm
from MyStack import MyStack

def par_math(str_par):
    my_stack = MyStack()
    balanced = True  # 左右括号是否匹配
    indx = 0
    while indx < len(str_par) and balanced:
        symbol = str_par[indx]
        # # pure parenthesis
        # if symbol == '(':
        # my_stack.push(symbol)
        # else:
        # if my_stack.isEmpty():
        # return False
        # else:
        # my_stack.pop()

		# more symbol
        if symbol in '([{':
            my_stack.push(symbol)
        else:
            if my_stack.isEmpty():
                balanced = False
            else:
                top = my_stack.pop()
                if not matches(top, symbol):
                    balanced = False
        # 必须有啊,没的话无限循环了
        indx = indx + 1

    # 最后栈为空,匹配完毕
    if balanced and my_stack.isEmpty():
        return True
    else:
        return False


def matches(open, close):
    opens = '([{'
    closes = ')]}'
    return opens.index(open) == closes.index(close)

if __name__ == '__main__':
    str_par = '([{])'
    res = par_math(str_par)
    print(res)

3. 结果

False

4. 注意点

  1. 栈的push()与pop()操作由python列表实现。注意时间复杂度为O(1).
  2. 若symbol不为左括号且栈为空,说明匹配存在问题,return False。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值