'''
思路:这是比较简单,用列表模拟栈;写的比简复杂
1.判断字符是在左括号列表中([{,直接堆入栈;
2.判断在右括号列表中([{,栈顶字符弹出,并和当前字符相比较
3.字符循环结果,并且比较值isMatch=True
4.最后判断栈stack是否是空,匹配完成,栈为空
注意:剪枝:成对的话字符长度除%2没有余数
空字符串返回True
'''
def isValid(s):
if len(s)==0:return True
if not len(s)%2==0:return False #有效括号总是成对出现
isMatch=True #初始化匹配值
left="([{" #左括号集
right=")]}" #右括号集
stack=[] #初始化栈
i=0 #字符指针
while isMatch and i<len(s): #循环字符列表
chr=s[i] #当前字符
if chr in left: #是左括号
stack.append(chr) #字符入栈
elif chr in right and len(stack)>0: #是右括号
left_chr=stack.pop() #栈顶弹出>左括号
left_i=left.index(left_chr)
right_i=right.index(chr)
if left_i==right_i: #左右括号相等
isMatch=True
else:
isMatch=False
else: #字符不是左右括号
isMatch=False
i=i+1
if len(stack)>0: #栈不为空
return False
else: #栈为空
return isMatch
list=["()","()[]{}","(]","([)]","{[]}","","((","){"]
for i in range(len(list)):
print(isValid(list[i]))
来源:oschina
链接:https://my.oschina.net/tedzheng/blog/3207666