数据结构之栈匹配符合

198 阅读1分钟
#/usr/bin/env python2.7
# -*- coding: utf-8 -*-
"""
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