栈的实现及应用 第2关:栈应用之括号匹配问题

任务描述

本关任务:编写程序检查该字符串的括号是否成对出现。

相关知识

为了完成本关任务,你需要掌握:栈的 Python 实现。栈的相关知识及其实现参见第一关。

编程要求

根据提示,在右侧编辑器 Begin - End 之间补充代码,判断字符串是否有效,即字符串中括号是否成对出现。若是,则输出 True ,否则输出 False 。其中字符串的字符只包含三种括号,花括号{}、中括号[]、圆括号(),即它仅由 ()[]{}六个字符组成。

提示

  • S1:遍历输入的括号序列,如果是左括号,进入S2,如果是右括号,进入S3;

  • S2:如果当前遍历到左括号,则入栈;

  • S3:如果当前遍历到右括号,则出栈一个元素,看其是否与当前的右括号组成一对,如果不是,则匹配失败。或者在出栈过程中发生异常(从空栈中出栈),也匹配失败;

  • S4:若能顺利遍历完成,检查栈中是否还有剩余元素,如果有,则匹配失败;如果没有,则匹配成功。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:{ [ ] ( ) } 预期输出:True

测试输入:[ ( { } [ ] ) ] 预期输出:True


开始你的任务吧,祝你成功!

参考答案

# -*- coding: utf-8 -*-
class Stack():
    # 创建空列表实现栈
    def __init__(self): 
        self.__list = []   
    # 判断是否为空
    def is_empty(self): 
        return self.__list == []
    # 压栈,添加元素
    def push(self,item): 
        self.__list.append(item)
    # 弹栈,弹出最后压入栈的元素
    def pop(self): 
        if self.is_empty():
            return 
        else:
            return self.__list.pop() 
'''请在Begin-End之间补充完成代码, 完成syntaxChecker函数, 解决括号匹配问题'''
def syntaxChecker(strList):
    ### strList: 字符串列表
    stack = Stack()
    left = '([{'     # 左括号
    right = ')]}'    # 右括号
    flag = True      # 标志位
    # ********** Begin ********** #
    # 遍历输入
    for i in strList:
        # 左括号,入栈
        if i in left:
            stack.push(i)
        # 右括号,出栈
        elif i in right: 
            #出栈异常,左括号为空,存在右括号,不匹配
            if stack.is_empty(): 
                flag = False
                break
            else:
                j = stack.pop()
                # 左右不匹配,False
                if left.find(j) != right.find(i): 
                    flag = False
                    break
    # 遍历后,栈非空,说明说明左括号个数大于右括号,不匹配
    if not stack.is_empty:
        flag = False
    # ********** End ********** # 
    return flag
if __name__ == "__main__":
    strList = input().split()
    result = syntaxChecker(strList)
    print(result)

题目链接:栈的实现及应用 (educoder.net)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值