给定一个字符串,里边可能包含“()”、"{}"两种括号,请编写程序检查该字符串的括号是否成对出现。 输出: true:代表括号成对出现并且嵌套正确,或字符串无括号字符。 false:未正确使用括号字符。
def check_brackets(string):
stack = []
brackets = {'(': ')', '{': '}'}
for char in string:
if char in brackets.keys():
stack.append(char)
elif char in brackets.values():
if not stack or brackets[stack.pop()] != char:
return False
return not stack
# 测试
input_string = input("请输入包含括号的字符串:")
result = check_brackets(input_string)
print(result)
对于这个问题,使用栈来检查括号的成对出现和嵌套正确是一种常见的解决方案。栈是一种后进先出(LIFO)的数据结构,对于括号匹配这样的问题,它通常可以派上用场。在处理括号问题时,栈可以帮助我们跟踪左括号的顺序,以便在遇到右括号时进行匹配。
当我们处理括号的成对匹配时,栈可以帮助我们跟踪左括号的顺序,以便在遇到右括号时进行匹配。这里的栈是指一种数据结构,可以将其想象成一堆盘子叠放在一起,后放入的盘子总是在顶部,先放入的盘子在底部。
括号匹配算法使用单个栈来检查字符串中的括号是否成对出现并且嵌套正确。它的思想是:
- 创建一个栈(可以称为括号栈)。
- 遍历字符串中的每个字符:
- 如果是左括号(例如'('或'{'),将其压入括号栈。
- 如果是右括号(例如')'或'}'),需要检查它是否与括号栈的栈顶元素匹配:
- 如果括号栈为空,或者括号栈的栈顶元素与当前右括号不匹配,那么括号未正确配对,返回False。
- 如果括号栈的栈顶元素与当前右括号匹配,将栈顶元素弹出,继续遍历字符串。
- 在遍历完整个字符串后,检查括号栈是否为空:
- 如果括号栈为空,表示所有的左括号都与右括号成功匹配,返回True。
- 如果括号栈不为空,表示存在未匹配的左括号,返回False。
举个例子:
假设我们有输入字符串为 "([]){}"。
- 遍历字符 '(',将其压入括号栈。
- 遍历字符 '[',将其压入括号栈。
- 遍历字符 ']',发现它与括号栈的栈顶元素 '[' 匹配,将栈顶元素弹出。
- 遍历字符 '{',将其压入括号栈。
- 遍历字符 '}',发现它与括号栈的栈顶元素 '{' 匹配,将栈顶元素弹出。
- 遍历完整个字符串后,括号栈为空,返回True,说明括号成对出现并且嵌套正确。
假设我们有输入字符串为 "([)]"。
- 遍历字符 '(',将其压入括号栈。
- 遍历字符 '[',将其压入括号栈。
- 遍历字符 ')',发现它与括号栈的栈顶元素 '[' 不匹配,返回False,说明括号未正确使用。
对于括号匹配算法,我们可以使用一个字典来存储左括号和右括号之间的对应关系。字典中的键是左括号,值是对应的右括号。
在遍历字符串的过程中,当我们遇到一个右括号时,我们需要检查它是否与括号栈的栈顶元素匹配。如果括号栈的栈顶元素是左括号,那么我们可以从字典中查找该左括号对应的右括号,然后与当前右括号进行比较。如果匹配成功,说明这对括号是成对匹配的,我们可以将左括号栈的栈顶元素弹出,表示这对括号已经匹配。如果匹配不成功,或者括号栈为空(即没有与之匹配的左括号),那么括号未正确配对,返回False。