给定一个只包含以下两种字符的字符串:'('和')'请判断这个字符串是否是一个合法的括号序列。一个合法的括号序列必须满足以下条件:
例如,字符串 "()"和"(())是合法的括号序列,而 "(()" 和 "(((" 则不是。
输入包含一个字符串 s,长度 ∣s∣ (2≤∣s∣≤105),字符串只包含以下字符:'(', ')'
如果字符串是合法的括号序列,输出 "Yes";否则,输出 "No".
(())
Yes
(((())
No
栈(Stack)是一种常见的线性数据结构,其特点是遵循“后进先出”(LIFO,Last In First Out)原则。也就是说,最后被压入栈中的元素会最先被弹出。
栈的基本操作包括:
栈可以通过数组或链表来实现。常见的实现方式有:
栈的操作时间复杂度通常是 O(1),即每次操作的时间是常数级别的,因为它只涉及栈顶元素。
例如,我们有一个栈,初始为空。我们依次执行以下操作:
通过栈的结构和操作,程序可以方便地处理许多递归或后进先出的任务。
给定一个只包含以下两种字符的字符串:'('
和 ')'
,请判断这个字符串是否是一个合法的括号序列。一个合法的括号序列必须满足以下条件:
例如,字符串 "()"
和 "(())"
是合法的括号序列,而 "(()"
和 "((("
则不是。
这道题的核心是判断一个字符串是否是合法的括号序列。一个合法的括号序列应该满足以下条件:
(
必须有一个对应的右括号 )
与其匹配。)
不能先于左括号 (
出现。我们可以利用栈来判断括号是否匹配。具体步骤如下:
(
时,就将其压入栈中。)
时,我们从栈中弹出一个元素,表示匹配到一个左括号。stack = [] # 创建一个空栈
(
,将其压入栈。)
,从栈中弹出一个元素,表示该右括号与栈顶的左括号匹配。如果此时栈为空,说明没有匹配的左括号,返回 No
。for char in s:
if char == '(': # 遇到左括号,压入栈
stack.append(char)
elif char == ')': # 遇到右括号
if not stack: # 如果栈为空,说明没有匹配的左括号
print("No")
exit(0) # 立即结束程序
stack.pop() # 弹出栈顶元素,匹配对应的左括号
if not stack: # 如果栈为空,说明所有的左括号都有匹配
print("Yes") # 输出 Yes
else:
print("No") # 如果栈不为空,输出 No
# 读取输入
s = input().strip() # 输入括号字符串
stack = [] # 创建一个栈
# 遍历字符串
for char in s:
if char == '(': # 遇到左括号,将其压入栈
stack.append(char)
elif char == ')': # 遇到右括号
if not stack: # 如果栈为空,说明没有匹配的左括号
print("No")
exit(0) # 立即结束程序
stack.pop() # 弹出栈顶元素,匹配对应的左括号
# 如果栈为空,说明所有的左括号都有匹配
if not stack:
print("Yes") # 如果栈为空,输出 Yes
else:
print("No") # 如果栈不为空,输出 No
stack = []
来模拟栈的功能。for char in s:
遍历字符串中的每个字符:
(
时,将其压入栈,表示待匹配的括号。)
时,检查栈是否为空。如果栈为空,说明没有匹配的左括号,直接返回 No
。如果栈不为空,则弹出栈顶的左括号,表示匹配成功。Yes
;若栈不为空,说明有未匹配的左括号,返回 No
。