Stack应用练习:判断括号串中的括号是否匹配
在做括号匹配之前需要使用数据结构——栈(Stack)来完成请参照博客python实现Stack,当然,为了方便使用,我把以列表尾部作为栈顶实现栈的代码放在这边。
class Stack(object):
"""以列表尾部为栈顶"""
def __init__(self):
self.items = []
def is_empty(self):
# 是否为空
return self.items == []
def push(self, item):
# 压栈
self.items.append(item)
def pop(self):
# 弹栈
self.items.pop()
def peek(self):
# 获取栈顶元素
return self.items[len(self.items) - 1]
def size(self):
# 获取栈的元素数量
return len(self.items)
算法分析
每一个左括号都有一个右括号匹配,第一个位置所在的左括号所匹配的右括号在最后一位,这里通过遍历字符串并跳过与括号无关的字符,遇到左括号将其压栈,如果遇到右括号则进行弹栈,弹出最后压入的左括号,如果栈中所有的左括号都可以匹配右括号,并且括号没有多余,那整个括号串就是匹配的,反之则不匹配。
# 导入自定义栈Stack
from Stack import Stack
# 定义匹配括号函数
def parChecker(symbolString):
s = Stack() # 创建Stack对象
balanced = True # 定义变量balance标识左右括号的数量是否平衡
index = 0
while index < len(symbolString) and balanced:
symbol = symbolString[index]
# 跳过括号之外的所有字符
if symbol not in ['(', ')']:
index += 1
continue
if symbol == '(':
# 左括号入栈
s.push(symbol)
else:
if s.is_empty():
balanced = False
else:
# 遇到右括号,左括号出栈
s.pop()
index += 1
if balanced and s.is_empty():
return True
return False
print(parChecker("print('%d,%10.3f,%10.3f' % (i, lst_time, d_time))"))
# True
print(parChecker("print('%d,(%10.3f,%10.3f' % (i, lst_time, d_time))"))
# False