栈应用之括号匹配Python

2020-11-26 10:22发布

括号匹配

括号匹配就是判断一个字符串中括号是否配对如 “((()))”,“(({([])}))”等等这样就是匹配的。而“())”,“{[}]”这样就不是匹配的。也就是必须成对出现,且没有交叉。
那么怎么解决这个问题呢?一个想法就是分别计算各自左右括号的数量,分别对比是否相等。但这样会将括号交叉时的情况误判为正常匹配。
进一步观察可以发现,右括号一定是和距离它最近的左括号是一对,否则就是括号交叉了,必定不匹配(比如[{]})。因此,当遇到右括号时,就向回查看,离他最近的一个左括号是否和他属于统一类型的括号,直到遍历完所有括号。
因为需要向回查看,所以可以用栈来试试。Python中没有栈数据类型,需要先手动实现栈。

class Stack(object):
	def __init__(self):
		self.lt = []
	
	def push(self, item):
		self.lt.append(item)
	
	def pop(self):
		return self.lt.pop()
	
	def peek(self):
		if len(self.lt) == 0:
			return ''
		else:
			return self.lt[-1]
	def size(self):
		return len(self.lt)
	
	def isEmpty(self):
		return self.lt == []1234567891011121314151617181920

定义好stack类之后,再来看括号匹配的问题。遍历给定的字符串,如果遇到左括号,就把它入栈,如果遇到右括号,就查看栈顶,此时栈内全是左括号,因此栈顶就是距离该右括号最近的左括号,查看是否属于一对,如果是则弹栈,继续遍历,重复上述动作,如果不是则不匹配。
那怎么判断是否属于一对呢?这里针对左右括号,分别定义两个列表,计算其下标即可。

def matches(left, right):
    l = '([{'
    r = ')]}'
    if l.index(left) == r.index(right):
        return True
    else:
        return False1234567
def parCheckers(symbolString):

    s = Stack()
    for i in symbolString:
    	# 左括号,入栈
        if i in '([{':
            s.push(i)
        else:
        	# 如果栈已空,则说明右括号多,不批匹配
            if s.isEmpty():
                break
            else:
            	# 否则判断是否是一对
                let = s.pop()
                if not matches(let, i):
                    break
                
    else:
    	# 已经遍历完,如果栈未空,说明左括号多,不匹配
        if s.isEmpty():
            return True
        else:
            return False
    return False



作者:qq_42907161

链接:https://blog.csdn.net/qq_42907161/article/details/108034314

来源:CSDN
著作权归作者所有,转载请联系作者获得授权,切勿私自转载。