HNU软件实训作业训练一编程题16. 合法的括号串

【问题描述】

一个合法的括号串,是指只包含括号的串,如果满足如下条件:

(1)<> () [] {} 这四对括号是合法的;

(2)如果r是合法括号串,则<r> (r) [r] {r}也是;

(3)如果r,s是合法括号串,则rs也是;

所以<<>> , [<>{}(())],[({<>})]是合法的括号串,而)(,[( ])就不是。

【输入形式】

输入第一行正整数t (10 ≤ n ≤ 100),表示有多少组测试数据。

后面有t行,每行一个只包含8种括号符号的括号串。

40%的括号串的长度L 2 ≤ L≤ 20;

30%的括号串的长度L 2 ≤ L≤ 200;

20%的括号串的长度L 2 ≤ L≤ 2000;

10%的括号串的长度L 2 ≤ L≤ 20000;

【输出形式】

对于每组测试数据,如果括号串是合法的,输出“Yes”(输出没有引号)占一行,否则,输出“No”(输出没有引号)占一行。

答案如下

def is_valid_brackets(s):
    stack = []
    brackets = {'<': '>', '(': ')', '[': ']', '{': '}'}
    
    for char in s:
        if char in brackets:  # 左括号,压入栈
            stack.append(char)
        elif char in brackets.values():  # 右括号
            if not stack or brackets[stack.pop()] != char:
                return "No"
    
    if not stack:
        return "Yes"
    else:
        return "No"
n=int(input())
for i in range(n):
    a=input()
    print(is_valid_brackets(a))
    

学到的知识

这道题学到了一个很有用的知识点---栈的应用

引言

栈是一种重要的数据结构,它遵循后进先出(LIFO)的原则。在Python中,栈可以通过内置的list类型实现,也可以使用collections模块中的deque类型来实现。栈在计算机科学和编程中有着广泛的应用,如函数调用、表达式求值、深度优先搜索等。

介绍

栈(Stack)是一种数据结构,它按照后进先出(LIFO,Last In First Out)的原则管理数据。这意味着最后入栈的元素会最先出栈,而最先入栈的元素会最后出栈。

栈的基本操作:

  1. Push(入栈):向栈中添加元素,放入栈顶。
    1. stack.append(1)

  2. Pop(出栈):从栈顶移除元素。
    1. 出栈操作是指从栈顶删除元素。在Python中,可以使用列表的pop()方法实现出栈操作。例如,以下代码从栈中删除并返回栈顶元素:

    2. top_element = stack.pop()

  3. Peek(查看栈顶元素):获取但不移除栈顶元素。
    1. 查看栈顶元素是指获取栈顶元素但不删除它。在Python中,可以使用列表的[-1]索引来获取栈顶元素。例如,以下代码查看并打印栈顶元素:
    2. top_element = stack[-1]  
      print(top_element)

  4. isEmpty(判断栈是否为空):检查栈中是否有元素。
    1. is_empty = len(stack) == 0  
      print(is_empty)

栈的特性:

  • 后进先出(LIFO):最后一个入栈的元素会成为第一个被弹出的元素。
  • 限制访问:只能从栈顶添加或移除元素,这种限制使得栈具有良好的封闭性和安全性。
  • 应用广泛:在计算机科学中,栈被广泛应用于处理函数调用、表达式求值、括号匹配等问题。

栈的实现方式:

  • 数组实现:使用数组可以轻松实现栈的基本操作。Python 中的列表可以用作栈,通过 append() 和 pop() 方法实现入栈和出栈操作。
  • 链表实现:使用链表来实现栈也是常见的方式,这种方式可以动态分配内存空间,但通常在实际应用中不如数组实现高效。

在括号匹配问题中,使用栈可以有效地跟踪和验证括号的嵌套关系,确保括号的开闭匹配是正确的,这也是栈在解决算法和数据结构问题中的典型应用之一。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值