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 parChecker(symbolString):
s = Stack()
balanced = True # 是否匹配
index = 0
while index < len(symbolString) and balanced:
symbol = symbolString[index]
if symbol == '(': # 是左括号就push到栈中
s.push(symbol)
else: # 若是右括号
if s.isEmpty(): # 若此时栈是空的,则匹配失败,右括号多了
balanced = False
else: # 若栈不空,则把栈里的左括号pop出来扔掉
s.pop()
index += 1
if balanced and s.isEmpty(): # 遍历完所有字符后,若栈是空的,就匹配成功;否则失败
return True
else:
return False
print(parChecker('((()))'))
print(parChecker('(()'))
def matches(open,close):
# 小技巧:只要判断对应的序号是否一样,一样就匹配成功
opens = '([{'
closers = ')]}'
return opens.index(opens) == closers.index(close)
def parChecker(symbolString):
s = Stack()
balanced = True # 是否匹配
index = 0
while index < len(symbolString) and balanced:
symbol = symbolString[index]
if symbol in '([{': # 是左括号就push到栈中
s.push(symbol)
else: # 若是右括号
if s.isEmpty(): # 若此时栈是空的,则匹配失败,右括号多了
balanced = False
else: # 若栈不空,则把栈里的左括号pop出来后做判断,若不是成对的括号,则匹配失败
top = s.pop()
if not matches(top,symbol):
balanced = False
index += 1
if balanced and s.isEmpty(): # 遍历完所有字符后,若栈是空的,就匹配成功;否则失败
return True
else:
return False