目录
1.什么是括号匹配
我们先来看这么一组括号"((()))",再这组括号里面,左括号和右括号相同,并且我们保证了每一个右括号前面必定有左括号可以跟它组成一个完整的括号,这就叫括号匹配。
我们来看看不匹配的例子:“())(()",这就是明显的不匹配,第三个括号是右括号,但是第一个左括号已经跟第二个匹配了,那么第三个右括号就变成了孤魂野鬼,就叫不匹配。
2.怎么实现算法
从左往右我们这里的思路是通过栈来实现括号匹配。我们将所有的括号进行遍历,具体思路如下:
(1)第一个元素是”)",那不需要犹豫,绝对不匹配了;
(2)第一个元素是"(",我们将这个左括号先存到栈里面,继续读下一个,如果还是"(",继续存。假设我们存了三个"("之后,读到一个")",那么就直接用pop函数,移除栈顶的左括号,表示成功匹配了一堆。理想状况下,如果能全部匹配成果,栈里的"("可以全部被消除,表示括号匹配,如果栈不为空,那肯定是不匹配了;
(3)现在我们来处理“())(()"这种情况,第一个"("压入栈中,第二个匹配,则消除栈中元素,当第三个元素")"读取时,我们判断栈是否为空,为空则表示不匹配。
3.具体程序代码
关于栈的描述,大家可以看一下我的这篇文章:
用python实现栈_这个bug有点多的博客-CSDN博客
下面是完整代码:
class Stack:
def __init__(self):
#我们定义空列表,实现栈的进入进出操作
self.items = []
def isEmpty(self):
#判断是否为空栈
return self.items == []
def push(self,item):
#向栈中加入元素,新的元素自动加入栈底
self.items.append(item)
def pop(self):
#移出栈顶元素。
return self.items.pop()
def peek(self):
#返回栈顶元素
return self.items[len(self.items)-1]
def size(self):
#返回栈的长度
return len(self.items)
#定义一个函数,用来检测括号是否匹配
def check(string):
s = Stack()#将前面定义的栈的类进行实例化
class_equal = True#定义初始匹配度为True
index = 0
while index < len(string) and class_equal:
test_str = string[index]
#当字符串是‘(’,则压入栈中
if test_str == '(':
s.push(test_str)
else:
#如果当前字符串是')',且栈中没有元素,说明不匹配
if s.isEmpty():
class_equal = False
else:
#如果栈不为空,那么去掉一个栈中的'(',表示有一对括号已匹配
s.pop()
index += 1
if class_equal and s.isEmpty():
return '所有括号匹配'
else:
return '不匹配'
print(check('((()))'))
print(check('()()))'))