数据结构与算法学习(python)之 用栈实现符号匹配

用python语言,通过栈来实现符号匹配注意事项:

1、通过列表的append()和pop()方法来实现进栈和出栈操作
2、注意判断列表栈为空的情况

首先,从小括号()匹配开始距离:

def parCharge(symbolString):
    # 用列表来实现栈
    s = []
    for i in range(len(symbolString)):
        # 对字符串中的每个字符进行处理
        symbol = symbolString[i]
        # 首先判断是不是左括号
        # 是左括号的话入栈
        if symbol == '(':
            s.append(symbol)
        # 是右括号的话,分情况判断
        else:
            # 是右括号并且此时栈为空(没有左括号与之匹配,则返回false)
            if len(s) == 0:
                return False
            # 是右括号,栈不为空,则出栈操作
            else:
                s.pop()
    # 循环结束,判断栈是否为空,不为空的话返回False
    if len(s) == 0:
        return True
    else:
        return False


# 测试用例
result = parCharge('(()))')
print(result)

通过以上举例发现符号匹配的通用步骤:

**
1、将符号字符传中的字符挨个取出
2、判断该字符是否为左括号,是的话入栈
3、该字符为右括号时,注意判断此时栈是否为空,如果为空,直接返回False,不为空的话才进行匹配操作
4、循环结束后,对栈是否为空进行判断,如果不为空(还有左括号剩余),则返回False或则返回True

根据以上案例,进行多符号()[]{}匹配操作。

# 用列表来实现栈的操作
# 符号匹配问题

dict1 = {'(': ')', '[': ']', '{': '}'}
def parChecker(symbolString):
    s = []
    for i in range(len(symbolString)):
        symbol = symbolString[i]
        # 如果是左括号,入栈
        if symbol in dict1.keys():
            s.append(symbol)
        # 不是左括号
        # 是右括号而且此时栈已经为空 结束循环
        else:
            if len(s) == 0:
                return False
            else:
            # 右括号且不为空,进行匹配操作
                r1 = s.pop()
                if dict1[r1] != symbol:
                    return False
    # 全部循环结束 如果s是空的
    if len(s) == 0:
        return True
    else:
        return False


s1 = '[][]{}(%'
result = parChecker(s1)
print(result)


多括号匹配问题:

1、首先将符号对应关系存储到字典中
2、与小括号匹配步骤相同,取出字符串字符,看其是否为左括号,是的话入栈
2、若是右括号,先判断此时栈是否为空,是空返回False,不是,将栈顶值取出作为字典的关键字(左括号),看该字典与之对应的符号是当前的右括号,如果不是,返回False
3、循环结束,判断栈是否为空(是否残留左括号),为空就返回True,不为空则返回False。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值