"""
Create Time: 2020/08/26 9:45 PM
Author: ada
"""
from pythonds.basic import Stack
def parChecker(synmbolString):
s = Stack()
balanced = True
index = 0
while index < len(synmbolString) and balanced:
symbol = synmbolString[index]
if symbol == "(":
print 'enter push'
s.push(symbol)
else:
if s.isEmpty():
print 'stack was empty'
balanced = False
else:
print 'enter pop'
s.pop()
index = index + 1
if balanced == True and s.isEmpty():
return True
else:
return False
'''
通过栈的实现()成对的balance,如果遇到(则push,否则则pop,当然最好如果数量不对等则balanced = False
其思想就是成对规律,所以可以用对偶来实现,其中一个push,另一个则pop
s = '(((()))))'
r = parChecker(s)
print r
'''
'''改进版,match多个字符'''
def parChecker(synmbolString):
s = Stack()
balanced = True
index = 0
while index < len(synmbolString) and balanced:
symbol = synmbolString[index]
if symbol in "([{":
print 'enter push'
s.push(symbol)
else:
if s.isEmpty():
print 'stack was empty'
balanced = False
else:
print 'enter pop'
top = s.pop()
print top,symbol
if not matches(top,symbol):
print 'enter false'
balanced = False
index = index + 1
if balanced == True and s.isEmpty():
return True
else:
return False
def matches(open,close):
opens = "([{"
closers = ")]}"
print open
print opens.index(open)
print closers.index(close)
return opens.index(open) == closers.index(close)
'''
用index来match符合成对,有一点理解比较不直观的是因为栈是后进先出,所以这里{是第三个进入又是第一个出来。所以opens和closes的match规则
要仔细揣磨下。或者也可以不用细想,索引号成对对应就行。
'''
s = '([{}])'
r = parChecker(s)
print r