【问题描述】
一个合法的括号串,是指只包含括号的串,如果满足如下条件:
(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)的原则管理数据。这意味着最后入栈的元素会最先出栈,而最先入栈的元素会最后出栈。
栈的基本操作:
- Push(入栈):向栈中添加元素,放入栈顶。
-
stack.append(1)
-
- Pop(出栈):从栈顶移除元素。
-
出栈操作是指从栈顶删除元素。在Python中,可以使用列表的pop()方法实现出栈操作。例如,以下代码从栈中删除并返回栈顶元素:
-
top_element = stack.pop()
-
- Peek(查看栈顶元素):获取但不移除栈顶元素。
- 查看栈顶元素是指获取栈顶元素但不删除它。在Python中,可以使用列表的[-1]索引来获取栈顶元素。例如,以下代码查看并打印栈顶元素:
-
top_element = stack[-1] print(top_element)
- isEmpty(判断栈是否为空):检查栈中是否有元素。
-
is_empty = len(stack) == 0 print(is_empty)
-
栈的特性:
- 后进先出(LIFO):最后一个入栈的元素会成为第一个被弹出的元素。
- 限制访问:只能从栈顶添加或移除元素,这种限制使得栈具有良好的封闭性和安全性。
- 应用广泛:在计算机科学中,栈被广泛应用于处理函数调用、表达式求值、括号匹配等问题。
栈的实现方式:
- 数组实现:使用数组可以轻松实现栈的基本操作。Python 中的列表可以用作栈,通过
append()
和pop()
方法实现入栈和出栈操作。 - 链表实现:使用链表来实现栈也是常见的方式,这种方式可以动态分配内存空间,但通常在实际应用中不如数组实现高效。
在括号匹配问题中,使用栈可以有效地跟踪和验证括号的嵌套关系,确保括号的开闭匹配是正确的,这也是栈在解决算法和数据结构问题中的典型应用之一。